نقاط نهاية WCF، baseAddressPrefixFilters، رؤوس المضيف

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

  •  05-07-2019
  •  | 
  •  

سؤال

لدي موقعين على نفس الجهازيشير الأول (العميل) إلى خدمة WCF على الموقع الثاني (الخادم).

كيف أقوم بتعيين عنوان مرجع الخدمة؟عند الانتقال من التطوير على جهازي المحلي إلى خادم تطوير المجموعة، كيف يمكنني تغيير عنوان URL الخاص بالخدمة؟يتم تمييز المواقع عن طريق رؤوس المضيف، مثلhttp://dev.admin/...وhttp://dev.public/...

أشعر أنه يمكن التعامل مع هذا باستخدام نقاط نهاية متعددة، لكنني جديد جدًا على WCF وليس لدي أدنى فكرة عما أفعله هنا.

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

المحلول

بعد الكثير من الإحباط، تمكنت من تحديد أن كلا من ملفات web.config (الموجودة على العميل والخادم، وكلاهما عبارة عن تطبيقات ويب في هذه الحالة)، يجب تغيير الأقسام التالية:

عميل:

   <client>
      <endpoint 
        address="http://mysite.com:port/services/someservice.svc"
        binding="basicHttpBinding" 
        bindingConfiguration="BasicHttpBinding_ISomeService"
        contract="MyServices.ISomeService" 
        name="BasicHttpBinding_ISomeService" />

    </client>
  </system.serviceModel>

الخادم

 <system.serviceModel>
    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="http://mysite.com:port/services"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServices.SomeServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MyServices.SomeServiceBehavior"
        name="MyServices.SomeService">
          <endpoint address="http://mysite.com:port/services/someservice.svc" 
                    name="endpoint.SomeService"
                    binding="basicHttpBinding" 
                    bindingConfiguration="" 
                    contract="MyServices.ISomeService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

الشيء الذي يجب ملاحظته هنا هو أن عنوان المضيف في الأقسام الثلاثة ذات الصلة (عنوان نقطة نهاية العميل، وقيمة الخادم baseAddressPrefixFilter، وعنوان نقطة نهاية الخادم) يجب أن يتطابق.

أنا قادر على التبديل بين الخوادم عن طريق تعديلها، طالما أنها متطابقة.ما زلت أفضل طريقة لتعيين هذا بناءً على الجهاز الذي يعمل عليه الخادم، ولكن هذا يعمل في الوقت الحالي.

انطباعات WCFما الحار:كائن مستمر.يحتفظ كائن وكيل العميل (الذي تم إنشاؤه عند إضافة مرجع خدمة) باتصال مستمر بالخدمة على الخادم.يحتفظ مثيل الخدمة المشار إليه بواسطة وكيل العميل بحالته بين الاستدعاءات، مما يمكن أن يبسط توقيعات الطريقة ويجعل كائن وكيل العميل والخدمة ككل أكثر فائدة لتطبيقات معينة.يمكن مشاركة أنواع كائنات المعلمات بين العميل والخادم إذا تم الإعلان عنها في مكتبة مشتركة، مما يعني أنه لا يتعين عليك إنشاء فئتين أو فئات مجمعة متشابهة جدًا لتمرير بنيات البيانات غير البدائية ذهابًا وإيابًا.

لم لا:إن التكوين هو ألم ملكي، وغير موثق بشكل جيد، ومتورط إلى حد كبير.إن جعل هذا يعمل في تكوين بيئة الاختبار/التطوير/التدريج/الإنتاج حيث تحتاج الخدمة إلى أن تكون على دراية بموقعها هو أمر محبط.لست مقتنعًا بأن جعل الخدمة على دراية بعنوان URL للمجال الخاص بها (بدلاً من، على سبيل المثال، المسار النسبي لأي شيء تعمل عليه) له أي فائدة كبيرة، بغض النظر عن المخاوف الأمنية.

ومع ذلك، فأنا مستمر في السير في مسار WCF حيث أن المزايا التي تفوق حتى الآن الصداع.

نصائح أخرى

وأسهل طريقة: تشغيل أجزاء WCF على منافذ مختلفة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top