在 azure WCF 中继中超过 64K 时出现异常

Exception when exceed 64K in azure WCF relay

我有这个代码 我是从这个azure wcf relay

实现的

我在发送大于 64K 的消息时遇到此异常(使用较小的消息它工作正常):

System.ServiceModel.CommunicationException: '已超出远程频道传入消息的最大消息大小配额。有关详细信息,请参阅服务器日志。

据此quota web page

NetTcpRelayBinding 中的配额是无限的

这是我的代码

class WCFRelay
{
    [ServiceContract(Namespace = "urn:ps")]
    interface IProblemSolver
    {
        [OperationContract]
        int Test(byte[] bytes);
    }

    class ProblemSolver : IProblemSolver
    {
        public int Test(byte[] bytes)
        {
            return bytes.Length;
        }
    }

    interface IProblemSolverChannel : IProblemSolver, IClientChannel { }

    public static void CreateClient()
    {
        var cf = new ChannelFactory<IProblemSolverChannel>(
        new NetTcpRelayBinding(),
        new EndpointAddress(ServiceBusEnvironment.CreateServiceUri("sb", "...", "solver")));

        cf.Endpoint.Behaviors.Add(new TransportClientEndpointBehavior
        { TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "...") });

        using (var ch = cf.CreateChannel())
        {
            // if its 50K its ok - if its 70K i get exception
            Console.WriteLine(ch.Test(new byte[1000 * 70]));
        }
    }

    public static void CreateServer()
    {
        ServiceHost sh = new ServiceHost(typeof(ProblemSolver));

        sh.AddServiceEndpoint(
           typeof(IProblemSolver), new NetTcpRelayBinding(),
           ServiceBusEnvironment.CreateServiceUri("sb", "...", "solver"))
            .Behaviors.Add(new TransportClientEndpointBehavior
            {
                TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "...")
            });

        sh.Open();

        while (true)
        {
            Thread.Sleep(1000);
        }
        Console.WriteLine("Press ENTER to close");
        Console.ReadLine();

        sh.Close();
    }
}

根据您的描述,我检查了这个问题,找到了原因。构造NetTcpRelayBinding时,MaxBufferSizeMaxReceivedMessageSize的默认值为64K,如下所示:

在服务器端和客户端构建 NetTcpRelayBinding 实例时,您可以将 MaxBufferSizeMaxReceivedMessageSizeMaxBufferPoolSize 指定为更大的值。

结果: