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
Günlüğünüzde hangi taraf (istemci/servis) size hata veriyor? –
@ PetarVučetin Hizmet. – ahoibakk
@ PetarVučetin İstemciyi izlemeyi denedim, ancak zaten attığı istisnadan başka bir bilgi vermiyor. – ahoibakk