سؤال

أحصل على اتصال غير مفيد للغاية عند محاولة الاتصال بخدمة WCF من Silverlight 3. رسالة الاستثناء هي "الخادم البعيد أعاد خطأً: Notfound." كل استثناء داخلي بباوات نفس الرسالة. هل هناك مشكلة في الإعداد الذي يمكن أن يسبب هذه المشكلة؟

ها هو الإعداد الخاص بي. يتم استضافة خدمة WCF في خدمة Windows تعمل على منصة .NET 4.0. لديها ثلاث نقاط نهاية:

  • تستخدم نقطة النهاية الرئيسية ملزمة PollingDexHttpBbinding ولها عنوان "DashboardService"
  • تستخدم نقطة نهاية تبادل البيانات الوصفية ملزمة mexhttpbinding ولها عنوان "mex"
  • تستخدم السياسة التي توفر نقطة النهاية (تحتاج إلى السماح للمكالمات المتقاطعة) بربط WebhttpBbinding ولها عنوان "".

إليك قسم System.ServicEmodel بالكامل:

<system.serviceModel>
    <extensions>
      <bindingExtensions>
        <add name="pollingDuplexHttpBinding" type="System.ServiceModel.Configuration.PollingDuplexHttpBindingCollectionElement, System.ServiceModel.PollingDuplex, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </bindingExtensions>
    </extensions>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="PolicyProviderBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="RoboTrader.TheFloor.DashboardService">
        <endpoint address="" binding="webHttpBinding"
          behaviorConfiguration="PolicyProviderBehavior"
          contract="RoboTrader.DashboardService.IPolicyProvider"/>
        <endpoint address="DashboardService" binding="pollingDuplexHttpBinding"
          contract="RoboTrader.DashboardService.IDashboardService"/>
        <endpoint address="DashboardService/mex" binding="mexHttpBinding" 
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/" />
          </baseAddresses>
        </host>
      </service>
    </services>
</system.serviceModel>

في رمز عميل Silverlight ، أضفت مرجعًا للخدمة ، ويبدو أنه كان على ما يرام. ويجلب العميل سياسة المجال المتقاطع على الخدمة كما هو متوقع. ومع ذلك ، عندما أتصل بطرق خدمات المعلومات الرئيسية ، أحصل على CommuniceException ، ولا يتم الوصول إلى نقطة توقف في طريقة جانب الخادم. إليك ملف Silverlight ClientConfig الذي تم إنشاؤه عن طريق إضافة مرجع الخدمة:

<system.serviceModel>
    <bindings>
        <customBinding>
            <binding name="PollingDuplexHttpBinding_IDashboardService">
                <binaryMessageEncoding />
                <httpTransport maxReceivedMessageSize="2147483647"
                  maxBufferSize="2147483647" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:8732/DashboardService" 
            binding="customBinding"
            bindingConfiguration="PollingDuplexHttpBinding_IDashboardService"
            contract="Service.IDashboardService" 
            name="PollingDuplexHttpBinding_IDashboardService" />
    </client>
</system.serviceModel>

هل هناك أي مشاكل في هذا الإعداد ، أم أن هناك أي أشياء إضافية بحاجة إلى القيام بها للحصول على رابط HTTP للاقتراع؟ أو هل تعرف على الأقل كيف يمكنني الحصول على مزيد من المعلومات حول ماهية المشكلة؟

تعديل:

لقد حاولت للتو إعداد روابط العميل والخادم من خلال التعليمات البرمجية بدلاً من ذلك لمعرفة ما إذا كان سيساعد ، لكنني ما زلت أحصل على استثناء متطابق. إليك رمز الخادم:

var dboardService = new DashboardService();
ServiceHost host = new ServiceHost(dboardService);
host.AddServiceEndpoint(
    typeof(IDashboardService),
    new CustomBinding(
        new PollingDuplexBindingElement(),
        new BinaryMessageEncodingBindingElement(),
        new HttpTransportBindingElement()),
    "DashboardService");
host.Open();

وهنا رمز العميل:

private IDashboardService _svc = new DashboardServiceClient(
    new PollingDuplexHttpBinding(),
    new EndpointAddress("http://localhost:8732/DashboardService"));

تحرير 2:

حاولت تغيير رمز العميل إلى هذا ، لكن المشكلة نفسها تحدث:

private IDashboardService _svc = new DashboardServiceClient(
    new CustomBinding(
        new PollingDuplexBindingElement(),
        new BinaryMessageEncodingBindingElement(),
        new HttpTransportBindingElement()),
    new EndpointAddress("http://localhost:8732/DashboardService"));
هل كانت مفيدة؟

المحلول

انت بالطبع تمزح! لقد وجدت السبب وراء عدم عمل هذا في مقال MSDN بعنوان قيود الوصول إلى أمان الشبكة في Silverlight:

أحد القيود الإضافية على استخدام فئات Sockets هو أن نطاق منفذ الوجهة الذي يُسمح له تطبيق الشبكة بالاتصال به يجب أن يكون في حدود 4502-4534. "

بعد تغيير رقم المنفذ الخاص بي إلى 4505 ، تم الوصول إلى رمز الخادم بعد تقديم طلب من Silverlight.

نصائح أخرى

حاول إنشاء نقطة النهاية من خلال التعليمات البرمجية ، بنفس الطريقة التي تقوم بها الآن. ولكن على جانب العميل ، قم بإنشاء الوكيل مثل ذلك.

CustomBinding binding = new CustomBinding(
                new PollingDuplexBindingElement(),
                new BinaryMessageEncodingBindingElement(),
                new HttpTransportBindingElement());


private IDashboardService _svc = new DashboardServiceClient(binding,
   new EndpointAddress("http://localhost:8732/DashboardService"));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top