2013-05-08 16 views
7

Geri aramaları kullanarak WCF ile veri akışı yapıyoruz. WCF, IIS'de barındırılıyor (varsayılan ayarlar, yalnızca protokollere net.tcp eklenmiştir).Güvenlik modu ile net.tcp üzerinden WCF hiçbiri istisna verir

Biz WCF güvenliği devre dışı bırakmak için çalışıyoruz, bu yüzden istemci ve sunucu üzerinde hem "hiçbiri", güvenlik modunu ayarlamak, ama ben şu CommunicationException olsun:

soket bağlantısı iptal edildi. Bu, iletinizi işleyen bir hata veya uzak ana bilgisayar tarafından bir alma zaman aşımı veya bir temel ağ kaynağı sorunu nedeniyle kaynaklanabilir. Yerel soket zaman aşımı '00: 00: 59.8439844 'idi.

Ben hizmet izleme üzerine koyduk ve TraceViewer bana şu istisna (System.ServiceModel.ProtocolException) verir:

Akış Güvenlik http://www.w3.org/2005/08/addressing/anonymous gereklidir, ancak hiçbir güvenlik bağlamı müzakere edildi. Bunun nedeni, bir StreamSecurityBindingElement öğesinin bağlantısından eksik olan uzak uç noktasından kaynaklanmaktadır.

Müşteri 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); 
     } 
    } 
} 

Müşteri 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> 

Bunun ne olabileceği Herhangi fikirler? Google'daki isabetlerin çoğu, istemci ve sunucudaki yapılandırmanın aynı olması gerektiğini (yani, hiç bir güvenlik) olmadığını, ancak hatayı bulamıyor gibi görünüyor.

WCF Service1.svc.cs içinde namesapace oluşturun: StreamSecurityBindingElement Googling Sorununu çoğaltamadı ama ben fark aynı kurulumu ve birkaç şey var

+0

Günlüğünüzde hangi taraf (istemci/servis) size hata veriyor? –

+0

@ PetarVučetin Hizmet. – ahoibakk

+0

@ PetarVučetin İstemciyi izlemeyi denedim, ancak zaten attığı istisnadan başka bir bilgi vermiyor. – ahoibakk

cevap

1

... hiç iyi explenations ile geldi.

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"> olmalıdır. Servis adı dolu Hizmet tipi. config

Hizmetler bölümü:

<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); 
     } 
    } 
} 

Geri arama

emin olun _callback.StreamSignalData (randomNumbers) işlemek; müşteri bağlantısı kesildiğinde. Bir iletişim istisnası alacaksınız.

+0

Girdiğiniz için teşekkürler, ancak maalesef bu sorunu çözmedim – ahoibakk

+0

Bu garip. Peki - "bilgisayarımda çalışır" rozetini kazandım: –