0

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

使用BasicHttpBinding这很好。

对于默认的WsHttpBinding,不考虑IsOneWay属性(与我创建的用于测试的非单向操作同时)。

我发现了两个有趣的事实:

  • 当我将SecurityMode设置为None时,它​​按预期工作

  • 当我将SessionMode设置为NotAllowed时,它也可以工作

我已经读过,如果会话被激活,消息将按顺序处理,以便解释行为。

但是为什么将SecurityMode设置为None也能达到目的呢?

这三个属性之间有什么关系,如何解释这些行为?

这是我的“基准”:

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

0 回答 0