Я создал свой первый проект Silverlight в VS 2008 Express и пытаюсь вызвать с ним веб-сервис WCF. Веб-сервис очень прост - я просто взял код по умолчанию, созданный при использовании шаблона службы WCF из VisualStudio, переименовал все, чтобы оно не было именем по умолчанию «Service1», и даже удалил сложный тип возвращаемого значения, чтобы единственный метод В контракте есть метод, который возвращает строку.
Со стороны Silverlight я создал новый проект из шаблона Silverlight, выбрав опцию, чтобы также создать содержащий веб-проект ASP.NET. Я оставил веб-проект без изменений, и приложение silverlight в настоящее время представляет собой просто кнопку и текстовое поле.
Я запустил свой проект WCF в отладчике и могу загрузить URL-адрес .svc в своем браузере, а также перейти к WSDL.
Используя svcutil.exe, я создал прокси-класс c # на основе этого WSDL. Я не использовал параметр / async, поэтому мой прокси-класс действительно имеет только 1 вызов удаленного метода, единственный метод GetData (int value), который возвращает строку.
В своем коде страницы Silverlight я создаю новый экземпляр моей службы, а затем пытаюсь вызвать GetData ().
SliverServiceClient client = new SliverServiceClient ();
client.GetData(1234);
В моем проекте silverlight я добавил следующую конфигурацию конечной точки / контракта в ServiceReferences.ClientConfig
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding
name="basicHttpBinding_ISliverService"
closeTimeout="00:01:00"
openTimeout="00:01:00"
receiveTimeout="00:15:00"
sendTimeout="00:01:00"
maxBufferSize="65530"
maxReceivedMessageSize="65530"
textEncoding="utf-8">
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint
address="http://localhost:8181/SliverService.svc"
binding="basicHttpBinding"
bindingConfiguration="basicHttpBinding_ISliverService"
contract="ISliverService"
name="basicHttpBinding_ISliverService" />
</client>
</system.serviceModel>
</configuration>
Обратите внимание, что я использую basicHttpBinding, поскольку, насколько я понимаю, это единственная привязка WCF, поддерживаемая Silverlight.
Моя проблема в том, что во время выполнения вызов client.GetData (1234) дает мне исключение NullReferenceException. Я подтвердил в отладчике, что клиент не null. Если я проверяю «клиента» из отладчика, я вижу, что следующие значения не null: ChannelFactory, Endpoint, State. Свойства Channel и InnerChannel выдают ошибку «невозможно оценить» в отладчике.
Я замечаю в прокси-классе, что GetData (значение int) просто
base.Channel.GetData(value);
Отладчик не позволит мне войти в прокси-класс, чтобы увидеть, является ли Channel пустым, но, похоже, это может быть only , если это не что-то из библиотеки ServiceModel.
Внутреннего исключения нет, и трассировка стека выглядит следующим образом:
at System.ServiceModel.Channels.Remoting.RealProxy.Invoke(Object[] args)
at proxy_2.GetData(Int32 )
at SliverServiceClient.GetData(Int32 accountID)
at Sliver.Page.MakeSliverCall(Object state)
at Sliver.Page..ctor()
at Sliver.App.Application_Startup(Object sender, StartupEventArgs e)
at System.Windows.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)
У меня нет , есть конфигурация конечной точки в веб-проекте ASP.NET web.config (хотя я пробовал ее и получал ту же ошибку).
Что, черт возьми, я здесь не так делаю? Кажется, это должно быть довольно просто.