Доступ к службе WCF из silverlight

#silverlight #wcf

#silverlight #wcf

Вопрос:

Мое приложение состоит из веб-сайта MVC3, который содержит элемент управления silverlight. В приложении MVC3 я размещаю службу WCF. Я использую эту службу в элементе управления silverlight для получения данных из базы данных.

В MVC web.config служба определяется как:

 <system.serviceModel>
<behaviors>
  <endpointBehaviors>
    <behavior name="OnlineCustomersTracker.Services.CustomersTrackerServiceAspNetAjaxBehavior">
      <enableWebScript />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
  multipleSiteBindingsEnabled="true" />
<services>
  <service name="OnlineCustomersTracker.Services.CustomersTrackerService">
    <endpoint address="" behaviorConfiguration="OnlineCustomersTracker.Services.CustomersTrackerServiceAspNetAjaxBehavior"
      binding="webHttpBinding" contract="OnlineCustomersTracker.Services.CustomersTrackerService" />
  </service>
</services>
  

Метод, который я вызываю, является:

  [OperationContract]
 [WebGet(ResponseFormat = WebMessageFormat.Xml)]
 public string DoWork()
 {
    // Add your operation implementation here
    return "Work done";
 }
  

В Silverlight я вызываю службу:

 CustomersTrackerServiceClient client = new CustomersTrackerServiceClient(new BasicHttpBinding(),
                                                                                 new EndpointAddress(
                                                                                     "http://localhost:62535/Services/CustomersTrackerService.svc"));
        client.DoWorkCompleted  = new System.EventHandler<DoWorkCompletedEventArgs>(client_DoWorkCompleted);
        client.DoWorkAsync();
  

Когда я обращаюсь к службе из silverlight, я получаю исключение: удаленный сервер вернул ошибку: NotFound.

Странная часть заключается в том, что служба работает из веб-браузера. Я делаю что-то не так в silverlight?

запрос приложения

Я отследил вызов из Firefox, и элемент управления silverlight отправляет сообщение на адрес службы: http://localhost:62535/Services/CustomersTrackerService.svc. Кажется, что моя служба прослушивает только запросы get. Есть ли какой-либо способ разрешить запрос post … или настроить службу в silverlight для отправки запросов get?

Комментарии:

1. вы пытались добавить файлы политики междоменного и клиентского доступа? имело ли это какое-либо значение?

Ответ №1:

Возможно, вы еще не настроили политику междоменного доступа…

Проверьте это, это может быть то, что вы пропустили:

http://www.codeproject.com/KB/silverlight/4StepsSilverLight.aspx

😉

Ричи

Ответ №2:

Эта общая ошибка на самом деле не очень полезна. В общем, вам может повезти больше, если вы включите ведение журнала в своей службе, поскольку это обычно дает дополнительные указания на то, что происходит не так, поскольку эта ошибка возникает во многих ситуациях.

Чтобы включить ведение журнала, вы можете добавить это в файл конфигурации для службы:

 <configuration>
....
<system.diagnostics>
<trace autoflush="true" />
<sources>
  <source name="System.ServiceModel" switchValue="Verbose">
    <listeners>
      <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData="D:pathtowcfLog.svcLog" />
    </listeners>
  </source>
</sources>
</system.diagnostics>
</configuration>
  

Другая проблема, с которой вы, вероятно, столкнетесь, — это междоменная проблема, особенно при первой попытке доступа к сайту с помощью клиента silverlight. Вы должны добавить crossdomain.xml и a clientaccesspolicy.xml в корне веб-сайта.

Они должны содержать xml, подобный этому:

CrossDomain.xml

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-http-request-headers-from domain="*" headers="*" />
 </cross-domain-policy>
  

ClientAccessPolicy.xml

 <?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource include-subpaths="true" path="/"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>
  

Клиенты Silverlight попытаются получить доступ к этим файлам в корне вашего сайта, и поэтому вы должны обслуживать их оттуда, что должно быть просто, если это сайт ASP, размещенный в IIS. Подробности в MSDN.

Вы можете предоставить службу WCF для их обслуживания, если ваша служба размещена самостоятельно, но ее сложнее настроить. Некоторые подробности о самостоятельном размещенном решении

Ответ №3:

Я, наконец, нашел проблему. Я неправильно настроил конечные точки. На самом деле у меня была только одна конечная точка — json. Я нашел отличную статью о настройке службы с несколькими конечными точками. http://www.codemeit.com/wcf/wcf-restful-pox-json-and-soap-coexist.html