在 azure WCF 中继中超过 64K 时出现异常
Exception when exceed 64K in azure WCF relay
我有这个代码 我是从这个azure wcf relay
实现的
我在发送大于 64K 的消息时遇到此异常(使用较小的消息它工作正常):
System.ServiceModel.CommunicationException: '已超出远程频道传入消息的最大消息大小配额。有关详细信息,请参阅服务器日志。
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
时,MaxBufferSize
和MaxReceivedMessageSize
的默认值为64K,如下所示:
在服务器端和客户端构建 NetTcpRelayBinding
实例时,您可以将 MaxBufferSize
、MaxReceivedMessageSize
、MaxBufferPoolSize
指定为更大的值。
结果:
我有这个代码 我是从这个azure wcf relay
实现的我在发送大于 64K 的消息时遇到此异常(使用较小的消息它工作正常):
System.ServiceModel.CommunicationException: '已超出远程频道传入消息的最大消息大小配额。有关详细信息,请参阅服务器日志。
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
时,MaxBufferSize
和MaxReceivedMessageSize
的默认值为64K,如下所示:
在服务器端和客户端构建 NetTcpRelayBinding
实例时,您可以将 MaxBufferSize
、MaxReceivedMessageSize
、MaxBufferPoolSize
指定为更大的值。
结果: