#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