我有一个带有单向操作的简单网络服务,我希望在调用时不会阻止客户端。
使用 BasicHttpBinding ,这很好。
使用默认的 WsHttpBinding 时,不会考虑 IsOneWay 属性(与我创建的非单向操作同时进行测试)。
我发现了两个有趣的事实:
当我将 SecurityMode 设置为 无 时,它按预期工作
当我将 SessionMode 设置为 NotAllowed 时,它也有效
我已经读过,如果会话被激活,则按顺序处理消息,以便解释行为。
但为什么将 SecurityMode 设置为 无 呢?
这三个属性之间的关系是什么以及如何解释这些行为?
这是我的“基准”:
[ServiceContract(/*SessionMode = SessionMode.NotAllowed*/)]
interface ILogService
{
[OperationContract]
void Log(string message);
[OperationContract(IsOneWay = true)]
void LogOneWay(string message);
}
class LogService : ILogService
{
public void Log(string message)
{
Thread.Sleep(100);
}
public void LogOneWay(string message)
{
Thread.Sleep(100);
}
}
public void Run()
{
ServiceHost host = new ServiceHost(typeof(LogService));
host.AddServiceEndpoint(typeof(ILogService), new WSHttpBinding(/*SecurityMode.None*/), "http://localhost:12345/log");
host.Open();
ILogService proxy = ChannelFactory<ILogService>.CreateChannel(new WSHttpBinding(/*SecurityMode.None*/), new EndpointAddress("http://localhost:12345/log"));
proxy.Log("");
const int n = 100;
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 0; i < n; ++i)
{
proxy.LogOneWay("");
Console.WriteLine(i);
}
stopwatch.Stop();
TimeSpan datagramTime = stopwatch.Elapsed;
stopwatch.Restart();
for (int i = 0; i < n; ++i)
{
proxy.Log("");
Console.WriteLine(i);
}
stopwatch.Stop();
TimeSpan halfDuplexTime = stopwatch.Elapsed;
host.Close();
Console.WriteLine("Half-duplex: {0}", halfDuplexTime);
Console.WriteLine("Datagram: {0}", datagramTime);
}