WCF، وبيانات التعريف، وBIGIP - هل يمكنني فرض عنوان url الصحيح لعناصر WSDL؟

StackOverflow https://stackoverflow.com/questions/634522

  •  10-07-2019
  •  | 
  •  

سؤال

لدينا خدمة WCF مستضافة على ServerA وهو خادم لا يتمتع بإمكانية الوصول المباشر إلى الإنترنت وله عنوان IP غير قابل للتوجيه عبر الإنترنت.

الخدمة مقدمة بواسطة BIGIP الذي يتعامل مع تشفير SSL وفك التشفير ويعيد توجيه الطلب غير المشفر إلى ServerA (في الوقت الحالي لا يقوم فعليًا بأي موازنة تحميل، ولكن من المحتمل أن تتم إضافته في المستقبل) على منفذ معين.

ما يعنيه ذلك هو أن عملائنا سيتصلون بالخدمة من خلالها https://www.OURDomain.com/ServiceUrl وسوف تحصل على خدمتنا على http://SeverA:85/ServiceUrl من خلال جهاز BIGIP.

عندما نتصفح للوصول إلى WSDL المنشور بتاريخ https://www.OURDomain.com/ServiceUrl تعتمد كافة العناوين الموجودة في WSDL على http://SeverA:85/ServiceUrl العنوان الأساسي

اكتشفنا أنه يمكننا استخدام إعداد رؤوس المضيف لتعيين النطاق، ولكن مشكلتنا هي أنه على الرغم من أن هذا سيؤدي إلى فرز النطاق، إلا أننا سنظل نستخدم المخطط الخاطئ - سيستخدم http://www.OURDomain.com/ServiceUrl بينما نحتاجه أن يكون Https.

أيضًا - نظرًا لأن لدينا خدمات أخرى (تعتمد على asmx) مستضافة على هذا الخادم، فقد واجهنا بعض المشكلات في تعيين رؤوس المضيف، ولذلك اعتقدنا أنه يمكننا التخلص من إنشاء موقع آخر على الخادم (باستخدام المنفذ 82، على سبيل المثال) وتعيين رأس المضيف على ذلك؛الآن، بالإضافة إلى مشكلة http/https، لدينا مشكلة لأن WSDL يحتوي على رقم المنفذ في جميع عناوين url، حيث يعمل BigIP على المنفذ 443 (لـ SSL)

هل هناك حل أكثر مرونة من تنفيذ رؤوس المضيف؟من الناحية المثالية، نحتاج إلى الاحتفاظ بالمرونة وسهولة الدعم.

شكرا على اي مساعدة…

هل كانت مفيدة؟

المحلول

هذه في الأساس مشكلة متعددة الأجزاء تتضمن عددًا من الحلول المنفصلة لتقديم الإجابة الكاملة.هناك ثلاث مشاكل في الجلوس خلف F5.

  1. اسم مضيف نقطة نهاية الخدمة المُعلن عنها.
  2. اسم المضيف للارتباطات إلى مخططات xsd:import'ed التي تصف عقد البيانات
  3. مشكلة http/https التي تصفها.

تغيير رؤوس المضيف، كما وجدت، يحل الحلين 1 و2 (يمكنك التعامل مع هذا بطرق أخرى غير رؤوس المضيف، ولكن لا داعي للخوض في ذلك هنا).الرقم 3 أكثر صعوبة بعض الشيء ويتطلب المزيد من التعليمات البرمجية (الكثير مما لا يمكن التخلص منه هنا).

الإجابة المختصرة هي أنك تحتاج إلى كتابة ContractBehavior الذي يقوم بتنفيذ كل من IContractBehavior وIWsdlExportExtension.

الشيء المهم الذي تحتاج إلى تنفيذه هو IWsdlExportExtension.ExportEndpoint.ضمن هذه الطريقة، تحتاج إلى التكرار على جميع ملحقات WsdlPort، وعندما تجد ملحقًا من النوع SoapAddressBinding، فإنك تحتاج إلى استبدال خاصية SoapAddressBinding.Location بـ Uri جديد يحتوي على محدد بروتوكول https.تحتاج أيضًا إلى إجراء عمليات بت مماثلة لعناوين استيراد xsd وروابط المخطط.

إذا كانت خدمتك تستخدم أيضًا WS-Addressing، فستحتاج إلى القيام بشيء مشابه للتعامل مع العناوين الإضافية التي تكتبها في wsdl.

لقد استندت في الكود الذي انتهيت من كتابته إلى مشروع WsdlExtras المتوفر على CodePlex (http://wcfextras.codeplex.com/).توفر الطريقة المستخدمة في WsdlExtras قاعدة رائعة لأي بتات إضافية قد تحتاج إلى إضافتها إليها (من الذاكرة لا أعتقد أنها تعاملت مع بتات WS-Addressing).الشيء الذي تريد إلقاء نظرة عليه هو "تجاوز عنوان URL لموقع عنوان SOAP".

نصائح أخرى

وبفضل الأقسام ألانسون، وكان لي بالضبط نفس السيناريو كما كان يوسي دهان، عملت ملف WCFExtras.dll بالنسبة لي،

وSTEP1. تحميل WCFExtras.dll (http://www.codeplex.com/WCFExtras/) .
الخطوة 2. إضافة أنها إشارة إلى المشروع.
الخطوه 3. لا تضيع وقتك في كتابة أي رمز كما هو مقترح في تطبيق الخادم العينة.
step4. فتح الملف web.config ثم ضع التعليمات البرمجية أدناه:

  <system.net>
     <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
     </settings>
  </system.net>

و

<system.serviceModel>
<services>
  <service behaviorConfiguration="ServiceBehaviorName" name="ServiceName">
    <endpoint address="" behaviorConfiguration="ServiceEndpointBehaviorName" binding="basicHttpBinding" contract="IServiceName">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="ServiceEndpointBehaviorName">
      <wsdlExtensions location="https://sslLoadBalancer/ServiceName.svc"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehaviorName">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <!-- Declare that we have an extension called WSDL Extras-->
    <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>
        </system.serviceModel>

و

وstep5. من المهم أيضا أن نلاحظ أنه إذا قمت بإضافة إشارة بهذا URL "https://sslLoadBalancer/ServiceName.svc" ثم فإنه لن ينجح، وتذكر دائما أن تضاف إشارة على النحو التالي: "https://sslLoadBalancer/ServiceName.svc?wsdl" بهذه الطريقة سوف تكون قادرا على إضافة إشارة إلى التطبيق الخاص بك.

هذا كل شيء ... إذا كان لا يزال لا يعمل بعد ذلك اسمحوا لي أن أعرف، وسوف لصق ملف web.config الكامل ..

والشكر

إذا كنت تقوم بإضافة SSL على رأس الخدمة الحالية، فإنه من المحتمل أن تؤثر أيضا على وضع الأمان هي ملزمة للعميل WCF، والتي يمكنك تجاوز بسهولة.

لاختصار، لماذا لا يتم فقط تحميل الملفات، تغيير URL إلى ما تريد، ونشرها يدويا كملفات؟

وحصلت على معلومات سرية كبيرة أن تعيين السمة عنوان على نقطة النهاية لعنوان الموقع الذي ترغب في عرضه في WSDL ثم قم بإضافة listenUri السمة إلى نقطة النهاية مع أوري الفعلي للاستماع على أن تفعل خدعة.

وهذا رابط في صفحة الاختبار لا نتأثر (أي أنها سوف لا تزال تظهر العنوان المحدد في ListenUri) ولكن ضمن WSDL سيتم تعيين أوري الصحيح (واحد محدد في العنوان.

ومعظم مزعج، على الرغم - عندما حاولت هذه بعد فترة وجيزة نشرت لي هذا السؤال، لم أتمكن من الحصول على عمل في IIS، فقط عندما الذاتي استضافة في التطبيق وحدة التحكم. فحص نفسي اليوم وجدت أنه يعمل فعلا. حتى الآن لست متأكدا لماذا لم يعمل بالنسبة لي قبل؛

وما قمنا به في الوقت نفسه والجامعة البريطانية في دبي سلوك مخصص بسيط التي غيرت وصف الخدمة وضع عنوان المطلوبة في WSDL من configurtion. من الواضح إذا كان هناك بنيت في دعم لأنه أفضل بكثير، ولذا فإنني سوف hopfully الحصول على بعض الوقت الاسبوع المقبل للنظر في هذه أبعد من ذلك.

لفئة الخدمة إضافة السمة:

<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>

وهذا يسمح للخدمة التي يتعين معالجتها من قبل العميل ك HTTPS: // ... ولكن هذه الخدمة التي ستستضيفها على http: // .....

في الملف web.config للمضيف الخدمة، يجب أن يكون العنصر نقطة النهاية لURL المطلق في سمة العنوان الذي هو URL العام التي سيتم استخدامها من قبل العميل. في نفس العنصر نقطة النهاية، تعيين السمة listenUri إلى URL المطلق الذي المضيف خدمة يصغي. الطريقة يمكنني تحديد ما هو الافتراضي URI المطلق المضيف يتم الإصغاء هو إضافة مرجع الخدمة في تطبيق عميل الذي يشير إلى خادم فعلي حيث يتم استضافة الخدمة. فإن الملف web.config للعميل أن يكون عنوانا لهذه الخدمة. I ثم نسخ ذلك في السمة listenUri في الملف web.config المضيفين.

في تكوين السلوك خدمتكم إضافة عنصر serviceMetaData مع السمة httpGetEnabled = صحيح

وهكذا سيكون لديك شيء من هذا القبيل:

<serviceBehaviors>
  <behavior name="myBehavior">
    <serviceMetadata httpGetEnabled="true" />
  </behavior
</serviceBehaviors>
...
<services>
  <service name="NamespaceQualifiedServiceClass" behavior="myBehavior" >
    <endpoint address="https://www.sslloadbalancer.com" binding="someBinding" contract="IMyServiceInterface" listenUri="http://www.servicehost.com" ...  />
  </service>
</services>

وأنا لست متأكدا إذا كان هذا يعمل مع الأمن رسالة أو أمن النقل. لهذا التطبيق معين، صدرت وثائق التفويض كجزء من DataContract ولذا فإننا قد basicHttpBinding وضع الأمان = لا شيء. منذ نقل آمنة (على موازن التحميل SSL) لم تكن هناك قضايا أمنية.

ومن الممكن في لمغادرة listenUri أيضا السمة فارغة، إلا أنه يجب أن تكون موجودة.

للأسف، ليس هناك خطأ في WCF حيث العنوان قاعدة المخططات المستوردة في WSDL يكون العنوان الأساسي listenUri بدلا من عنوان قاعدة العامة (واحد تكوين باستخدام السمة عنوان نقطة النهاية). كمحاولة للتغلب على هذه المسألة، تحتاج إلى إنشاء التنفيذ IWsdlExportExtension الذي يجمع المخططات المستوردة في المستند WSDL مباشرة ويزيل الواردات. ويقدم مثالا على ذلك هنا http://winterdom.com/2006/10/inlinexsdinwsdlwithwcf . بالإضافة إلى ذلك يمكنك الحصول على وراثة سبيل المثال الدرجة من BehaviorExtensionElement واستكمال طريقتين جديدة مع:

Public Overrides ReadOnly Property BehaviorType() As System.Type
    Get
        Return GetType(InlineXsdInWsdlBehavior)
    End Get
End Property

Protected Overrides Function CreateBehavior() As Object
    Return New InlineXsdInWsdlBehavior()
End Function

وهذا سوف يسمح لك لإضافة السلوك التمديد في ملف .config وإضافة السلوك باستخدام التكوين بدلا من الاضطرار إلى إنشاء مصنع الخدمة.

وتحت عنصر التكوين system.servicemodel إضافة:

  <endpointBehaviors>
    <behavior name="SSLLoadBalancerBehavior">          
      <flattenXsdImports/>
    </behavior>
  </endpointBehaviors>
        </behaviors>
<extensions>
  <behaviorExtensions>
    <!--The full assembly name must be specified in the type attribute as of WCF 3.5sp1-->
    <add name="flattenXsdImports" type="Org.ServiceModel.Description.FlattenXsdImportsEndpointBehavior, Org.ServiceModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>        
  </behaviorExtensions>
</extensions>

وثم الرجوع إلى السلوك نقطة النهاية جديد في التكوين نقطة النهاية باستخدام السمة behaviorConfiguration

<endpoint address="" binding="basicHttpBinding" contract="WCFWsdlFlatten.IService1" behaviorConfiguration="SSLLoadBalancerBehavior">
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top