Работа с netTcpBinding в Silverlight
Я создал службу WCF, размещенную в IIS 7
Моя версия.NET 4.0
Моя операционная система Windows 7 Ultimate
Мой сервисный адрес:
- net.tcp: // локальный:4504/WPFHost/ ТСР
Когда я добавил сервисную ссылку, я получил два предупреждения:
Первый:
Warning 2 Custom tool warning: Endpoint 'NetTcpBinding_IChat' at address 'net.tcp://localhost:4504/WPFHost/tcp' is not compatible with Silverlight 4. Skipping... D:\Projects\C#\WCF\SilverlightApplication1\SilverlightApplication1\Service References\SV\Reference.svcmap 1 1 SilverlightApplication1
Во-вторых:
Warning 3 Custom tool warning: No endpoints compatible with Silverlight 4 were found. The generated client class will not be usable unless endpoint information is provided via the constructor. D:\Projects\C#\WCF\SilverlightApplication1\SilverlightApplication1\Service References\SV\Reference.svcmap 1 1 SilverlightApplication1
Мой файл Appconfig службы, как показано ниже:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true"/>
</system.web>
<system.serviceModel>
<services>
<service name="WCFService.Service"
behaviorConfiguration="behaviorConfig">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:4504/WPFHost/"/>
<add baseAddress="http://localhost:4505/WPFHost/"/>
</baseAddresses>
</host>
<endpoint address="tcp"
binding="netTcpBinding"
bindingConfiguration="tcpBinding"
contract="WCFChatLibrary.IChat"/>
<endpoint address="net.tcp://localhost:4503/WPFHost/mex"
binding="mexTcpBinding"
contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfig">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="tcpBinding"
maxBufferSize="67108864"
maxReceivedMessageSize="67108864"
maxBufferPoolSize="67108864"
transferMode="Buffered"
closeTimeout="00:00:10"
openTimeout="00:00:10"
receiveTimeout="00:20:00"
sendTimeout="00:01:00"
maxConnections="100">
<security mode="None">
</security>
<readerQuotas maxArrayLength="67108864"
maxBytesPerRead="67108864"
maxStringContentLength="67108864"/>
<reliableSession enabled="true" inactivityTimeout="00:20:00"/>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>
</configuration>
Когда я звоню в сервис, это исключение. Вот мой код:
if (this.proxy == null)
{
try
{
this.StatusTxtBlock.Text = "Ready";
this.localClient = new Client();
this.localClient.Username = "User-" + Guid.NewGuid();
this.proxy = new ChatClient(new InstanceContext(this));
this.proxy.OpenAsync();
this.proxy.ConnectAsync(this.localClient);
this.proxy.ConnectCompleted += new EventHandler<ConnectCompletedEventArgs>(proxy_ConnectCompleted);
}
catch (Exception ex)
{
this.StatusTxtBlock.Text = "Exception: "+ ex.Message;
}
}
и исключение:
Exception: The given key was not present in the dictionary
Я следую этому уроку, но не повезло
Я не знаю, что делать, мой разум и зрение исчезают, может быть, я схожу с ума. Пожалуйста, кто-нибудь, спасите меня (я имею в виду, помогите мне).
2 ответа
Silverlight 4 поддерживает подмножество NetTcpBinding
на сервере. Например, он не поддерживает безопасность (что хорошо для вашего случая, так как у вас есть <security mode="None">
в вашей привязке), и он также не поддерживает надежный обмен сообщениями (что, вероятно, является проблемой в вашем случае, так как он включен в привязке). Это одна обязательная конфигурация для netTcpBinding
который совместим с SL:
<bindings>
<netTcpBinding>
<binding name="SLCompatible">
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
В этой статье MSDN говорится, что NetTcpBinding
не может использоваться с Silverlight 4.
Я не уверен, верить ли Томашу Янчуку или MSDN, но статье Томаша 2 года, поэтому я думаю: NetTcpBinding
был запланирован для Silverlight 4, но не включен в конце.
Вы можете рассмотреть возможность перехода на BasicHttpBinding
или "сверните свой собственный" пользовательский переплет, как описано в следующей статье.