2011-12-31 5 views
1

Я хочу знать, как я могу использовать обычную службу WCF (а не службу WCF Silverlight) в моем приложении Silverlight. Вот что я пыталсяКак использовать WCF в приложении silverlight

  1. Я создал простую нормальную службу WCF
  2. Я изменил связывание с basicHttpBinding в web.config файле
  3. Я поместил clientaccesspolicy.xml и crossdomain.xml файлы в папке wwwroot.

Но даже несмотря на то, что я не могу использовать службу WCF. Я получаю это исключение

System.ServiceModel.CommunicationException был необработанное по коду пользователя
сообщение = Произошла ошибка при попытке сделать запрос к URI «HTTP: //localhost/HWT/HelloWorldService.svc». Это может быть связано с тем, что пытается получить доступ к службе в междоменном режиме без надлежащей политики междоменного домена или политики, непригодной для служб SOAP . Вам может потребоваться связаться с владельцем службы, чтобы опубликовать файл политики междоменной политики и обеспечить его отправку заголовков HTTP , связанных с SOAP. Эта ошибка также может быть вызвана использованием внутренних типов в прокси-сервере веб-службы без использования атрибута InternalsVisibleToAttribute. Для получения дополнительной информации см. Внутреннее исключение .
StackTrace:
на System.ServiceModel.AsyncResult.End [TAsyncResult] (IAsyncResult результат)
в System.ServiceModel.Channels.ServiceChannel.EndCall (String действия, Object [] выходы, IAsyncResult результат)
в системе. ServiceModel.ClientBase 1.ChannelBase 1.EndInvoke (String имяМетода, Object [] арг, IAsyncResult результат)
на ServiceRef.HelloWorldServiceClient.HelloWorldServiceClientChannel.EndGetName (IAsyncResult результат)
на ServiceRef.HelloWorldServiceClient.TestSilClient.ServiceRef.IHelloWorldService.EndGetName (Результат IAsyncResult)
в TestSilClient.ServiceRef.HelloWorldServiceClient.OnEndGetName (IAsyncResult результат)
на System.ServiceModel.ClientBase`1.OnAsyncCallCompleted (IAsyncResult результат)

InnerException: System.Security.SecurityException
Message = ""
StackTrace:
на System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, объект состояние)
на System.Net.Browser.BrowserHttpWebRequest.EndGetResponse (IAsyncResult AsyncResult)
в System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse (IAsyncResult результат)

InnerException: System.Security.SecurityException
сообщение об ошибке = безопасности.
StackTrace:
в System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult)
в System.Net.Browser.BrowserHttpWebRequest. <> c_ DisplayClass5.b _4 (Объект sendState)
at System.Net.Browser.AsyncHelper. <> c_ DisplayClass4.b _1 (Object sendState)

Может кто-нибудь объяснить, что это лучший способ, чтобы потреблять нормальный сервис WCF в Silverlight приложения? Пример поможет мне.

спасибо.

+0

Можете ли вы ** показать нам ** соответствующие части из вашего файла 'web.config'? (что-нибудь внутри раздела ''). Это исключение безопасности, поэтому я думаю, что это имеет какое-то отношение к тому, как ваш веб-сервис ожидает, что пользователи будут аутентифицироваться. –

+0

Хм, можете ли вы подключиться к сервису в противном случае? Можете ли вы назвать его с помощью WcfTestClient? Можете ли вы назвать это, если у вас есть приложение Silverlight и служба на одном сайте? (Вот где я начну следить за наблюдением @marc_s) – Murph

ответ

0

Возможные причины вашей проблемы к моему знанию:

  1. неправильно построенные файлы политики
  2. ошибочно помещенные файлы политики (должны быть помещены в корневой папке веб-приложения, на котором размещены веб-служб по не в услугах папки, если у вас есть один)

вы можете проверить, если приложение SL запрашивает какой-либо из файлов политик с помощью т.е. Скрипач. Если вы видите, что файл политики загружен, но приложение не работает, то, вероятно, является причиной 1. Если файлы не запрашиваются, вы, вероятно, их неправильно уместили (как в пункте 2).

Существует возможность вообще не использовать файлы политики. Если ваши веб-службы размещены в том же веб-приложении, что и приложение Silverlight, вы можете передать относительный путь к WS в конфигурации конечной точки клиента (.ClientConfig), а файлы кросс-домена/политики не потребуются. Например, вместо использования address="http://localhost/Services/ExampleService.svc" используйте sth, например address="../Services/ExampleService.svc" (в зависимости от папки, в которой находится файл XAP). Для получения дополнительной информации посетите http://msdn.microsoft.com/en-us/library/cc197941%28v=vs.95%29.aspx.

0

Постарайтесь ослабить свой файл crossdomain (только ради теста), чтобы проверить, не является ли это проблемой. Используйте этот код в файле crossdomain.xml и посмотрите, работает ли он:

<?xml version="1.0" ?> 
<cross-domain-policy> 
    <allow-access-from domain="*"/> 
    <site-control permitted-cross-domain-policies="all"/> 
    <allow-http-request-headers-from domain="*" headers="*"/> 
</cross-domain-policy>