Работа с netTcpBinding в Silverlight - PullRequest
       45

Работа с netTcpBinding в Silverlight

0 голосов
/ 11 ноября 2011

Я создал службу 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 ]

1 голос
/ 11 ноября 2011

Silverlight 4 поддерживает подмножество NetTcpBinding на сервере. Например, он не поддерживает безопасность (что подходит для вашего случая, поскольку в вашем связывании есть <security mode="None">), а также не поддерживает надежный обмен сообщениями (что, вероятно, является проблемой в вашем случае, поскольку у вас есть это включено в вашей привязке). Это одна обязательная конфигурация для netTcpBinding, которая совместима с SL:

<bindings>
  <netTcpBinding>
    <binding name="SLCompatible">
      <security mode="None"/>
    </binding>
  </netTcpBinding>
</bindings>
0 голосов
/ 11 ноября 2011

В этой статье MSDN говорится, что NetTcpBinding нельзя использовать с Silverlight 4.

Я не уверен, верить ли Томашу Янчуку или MSDN, но статье Томаша 2 годапоэтому я предполагаю: NetTcpBinding было запланировано для Silverlight 4, но не включено в конец.

Вы можете переключиться на BasicHttpBinding или «свернуть свою собственную» пользовательскую привязку, как описано в следующая статья .

...