2013-05-08 1 views
7

Мы передаем данные с помощью WCF с помощью обратных вызовов. WCF размещен в IIS (настройки по умолчанию, просто добавлены net.tcp в протоколы).WCF поверх net.tcp с режимом безопасности no дает исключение

Мы пытаемся отключить систему безопасности на WCF, поэтому я установил режим безопасности на «нет», как на клиенте и на сервере, но я получаю следующее CommunicationException:

сокет-соединение был прерван. Это может быть вызвано ошибкой , обрабатывающей ваше сообщение или превышением тайм-аута приема на удаленном хосте , или проблема с сетевым ресурсом. Локальный сокет таймаут был '00: 00: 59.8439844 '.

Я положил на трассировку на службе и TraceViewer дает мне следующее исключение (System.ServiceModel.ProtocolException):

Поток безопасности требуется на http://www.w3.org/2005/08/addressing/anonymous, но не безопасность контекста был обсужден. Вероятно, это связано с удаленной конечной точкой , которая не имеет элемента связи StreamSecurityBindingElement.

Клиент Program.cs:

using System; 
using System.ServiceModel; 
using WcfClient.ServiceReference1; 

class Program { 
    static void Main() { 
     Callback callback = new Callback(); 
     InstanceContext context = new InstanceContext(callback); 
     Service1Client service1Client = new Service1Client(context, 
                  "NetTcpBinding_IService1"); 


     service1Client.GetData(0); 
     Console.Read(); 
     service1Client.Stop(); 
    } 
} 

internal class Callback : IService1Callback { 
    public void StreamSignalData(int[] result) { 
     foreach (int i in result) { 
      Console.WriteLine(DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss.fff") + 
           ": " + i); 
     } 
    } 
} 

Client App.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="NetTcpBinding_IService1"> 
      <security mode="None" /> 
     </binding> 
     </netTcpBinding> 
     <wsDualHttpBinding> 
     <binding name="WSDualHttpBinding_IService1"> 
      <reliableSession ordered="true" /> 
      <security mode="None" /> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/wcf-error/Service1.svc" 
     binding="wsDualHttpBinding" 
     bindingConfiguration="WSDualHttpBinding_IService1" 
     contract="ServiceReference1.IService1" 
     name="WSDualHttpBinding_IService1" /> 
     <endpoint address="net.tcp://localhost/wcf-error/Service1.svc" 
     binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IService1" 
     contract="ServiceReference1.IService1" name="NetTcpBinding_IService1"> 
     </endpoint> 
    </client> 
    </system.serviceModel> 
</configuration> 

WCF Service1.svc.cs

using System; 
using System.Net.Security; 
using System.ServiceModel; 
using System.Threading; 

[ServiceContract(SessionMode = SessionMode.Required, 
       CallbackContract = typeof(IStreamCallback), 
       ProtectionLevel = ProtectionLevel.None)] 
public interface IService1 { 
    [OperationContract] 
    void GetData(int value); 

    [OperationContract] 
    void Stop(); 
} 

public interface IStreamCallback { 
    [OperationContract(IsOneWay = true)] 
    void StreamSignalData(int[] result); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
[CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class Service1 : IService1 { 
    private Timer _timer; 

    private readonly IStreamCallback _callback = 
      OperationContext.Current.GetCallbackChannel<IStreamCallback>(); 
    public void GetData(int value) { 
     _timer = new Timer(StreamData, null, 0, 500); 
    } 

    public void Stop() { 
     _timer.Dispose(); 
    } 

    private void StreamData(object state) { 
     int[] randomNumbers = new int[50]; 
     Random random = new Random(); 
     for (int i = 0; i < 50; i++) { 
      randomNumbers[i] = random.Next(100); 
     } 
     _callback.StreamSignalData(randomNumbers); 
    } 
} 

WCF Web.config

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
    <compilation targetFramework="4.0" debug="true"/> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="netTcpBinding" > 
      <security mode="None" /> 
     </binding> 
     </netTcpBinding> 
     <wsDualHttpBinding> 
     <binding name="wsDualHttpBinding"> 
      <security mode="None" /> 
     </binding> 
     </wsDualHttpBinding> 
    </bindings> 
    <protocolMapping> 
     <add scheme="http" binding="wsDualHttpBinding"/> 
    </protocolMapping> 
    <services> 
     <service name="Service"> 
     <endpoint address="" binding="wsDualHttpBinding" 
      bindingConfiguration="wsDualHttpBinding" 
      name="EndPointHTTP" contract="WcfService1.IService1"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" name="mex" 
      contract="IMetadataExchange" /> 
     <endpoint binding="netTcpBinding" bindingConfiguration="netTcpBinding" 
      name="EndPointTCP" contract="WcfService1.IService1" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <useRequestHeadersForMetadataAddress /> 
      <dataContractSerializer /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

Любые идеи, что это может быть? Большинство хитов в google говорят, что конфигурация на клиенте и на сервере должна быть одинаковой (то есть без защиты), но я не могу найти ошибку. погуглить для StreamSecurityBindingElement придумал ничего хорошего explenations ...

+0

Какая сторона (клиент/услуга) дает вам ошибку в вашем журнале? –

+0

@ PetarVučetin Услуга. – ahoibakk

+0

@ PetarVučetin Я попытался нарисовать трассировку на клиенте, но он не дает мне никакой другой информации, кроме исключения, которое он уже бросает. – ahoibakk

ответ

1

Я не мог воспроизвести вашу проблему, но у меня же установка и несколько вещей, которые я заметил:

Создать namesapace в вашем WCF Service1.svc.cs.

namespace WcfService1 
    { 
     [ServiceContract(SessionMode = SessionMode.Required, 
      CallbackContract = typeof (IStreamCallback), 
      ProtectionLevel = ProtectionLevel.None)] 
     public interface IService1 
     { 
     ..... 
     [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
     [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
     public 

    class Service1 : IService1 
    { 

<service name="Service"> должен быть <service name="WcfService1.Service1">. Имя службы заполнено. Тип услуги.

Услуги раздела в конфигурации:

<services> 
    <service name="WcfService1.Service1"> 
     <endpoint address="" binding="wsDualHttpBinding" 
      bindingConfiguration="wsDualHttpBinding" 
      name="EndPointHTTP" contract="WcfService1.IService1"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" name="mex" 
      contract="IMetadataExchange" /> 
     <endpoint binding="netTcpBinding" bindingConfiguration="netTcpBinding" 
      name="EndPointTCP" contract="WcfService1.IService1" /> 
    </service> 
</services> 

WCF Service1.svc.CS

using System; 
using System.Net.Security; 
using System.ServiceModel; 
using System.Threading; 

namespace WcfService1 
{ 
    [ServiceContract(SessionMode = SessionMode.Required, 
     CallbackContract = typeof (IStreamCallback), 
     ProtectionLevel = ProtectionLevel.None)] 
    public interface IService1 
    { 
     [OperationContract] 
     void GetData(int value); 

     [OperationContract] 
     void Stop(); 
    } 

    public interface IStreamCallback 
    { 
     [OperationContract(IsOneWay = true)] 
     void StreamSignalData(int[] result); 
    } 

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
    public class Service1 : IService1 
    { 
     private Timer _timer; 

     private readonly IStreamCallback _callback = 
      OperationContext.Current.GetCallbackChannel<IStreamCallback>(); 

     public void GetData(int value) 
     { 
      _timer = new Timer(StreamData, null, 0, 500); 
     } 

     public void Stop() 
     { 
      _timer.Dispose(); 
     } 

     private void StreamData(object state) 
     { 
      int[] randomNumbers = new int[50]; 
      Random random = new Random(); 
      for (int i = 0; i < 50; i++) 
      { 
       randomNumbers[i] = random.Next(100); 
      } 
      _callback.StreamSignalData(randomNumbers); 
     } 
    } 
} 

Ответный

Убедитесь, что ручка _callback.StreamSignalData (randomNumbers); когда клиент отключается. Вы получите сообщение об исключении.

+0

Спасибо за ваш вклад, но, к сожалению, это не решило мою проблему. – ahoibakk

+0

Это странно. Ну, я заработал значок «Это работает на моем компьютере»: –