IsOneWay如何与SessionMode和SecurityMode相关?

时间:2013-11-01 23:57:40

标签: c# .net wcf basichttpbinding wshttpbinding

我有一个带有单向操作的简单网络服务,我希望在调用时不会阻止客户端。

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

0 个答案:

没有答案