我有一个托管WebAPI的ServiceFabric服务。在控制器上,我在我的请求中收到FileStream
。我在那里阅读FileStream
没有问题。
然后,我希望这个WebAPI服务调用另一个SF服务(有状态) - 让我们称之为Service2,在参数中给出MemoryStream
。
try
{
await _service2Proxy.MyService2Method(myMemoryStream, otherParameters);
// Line after
}
catch
{
// Error handling
}
在Service2中
public Task MyService2Method(MemoryStream ms, string otherParam)
{
// Log line
// Do something
}
它与File< 3 MB。然而,使用文件> 5 MB,通话不起作用。我们永远不会继续// Line after
,// Error handling
或// Log line
。
我确实在控制器程序集,WebAPI服务程序集和Service2程序集上添加了[assembly: FabricTransportServiceRemotingProvider(MaxMessageSize = int.MaxValue)]
。
Service2界面具有[OperationContract]
和[ServiceContract]
属性。
我还尝试发送byte[]
而不是MemoryStream
。问题仍然存在。
答案 0 :(得分:1)
如果它是StatefulService并且你使用一些ReliableDictionary和大量数据,当SF复制你的字典数据时,它可能会导致类似的问题。
您可以设置另外两个设置来阻止这种情况:
代码:
public MyStateFulService(StatefulServiceContext context)
: base(context, new ReliableStateManager(context, new ReliableStateManagerConfiguration(new ReliableStateManagerReplicatorSettings
{
MaxReplicationMessageSize = 1073741824
}))){ }
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
var setting = new FabricTransportListenerSettings();
setting.MaxMessageSize = 1073741824;
return new[] { new ServiceReplicaListener(initParams => new FabricTransportServiceRemotingListener(initParams, this, setting), "RpcListener")};
}
编辑:
更好的方法:如果您在副本之间进行身份验证,则应在Settings.xml中设置这些设置。
<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<!-- This is used by the StateManager's replicator. -->
<Section Name="ReplicatorConfig">
<Parameter Name="ReplicatorEndpoint" Value="ReplicatorEndpoint" />
<Parameter Name="MaxReplicationMessageSize" Value="1073741824" />
</Section>
<!-- This is used for securing StateManager's replication traffic. -->
<Section Name="ReplicatorSecurityConfig">
<Parameter Name="CredentialType" Value="Windows" />
<Parameter Name="ProtectionLevel" Value="None" />
</Section>
<!-- Add your custom configuration sections and parameters here. -->
<!--
<Section Name="MyConfigSection">
<Parameter Name="MyParameter" Value="Value1" />
</Section>
-->
</Settings>
答案 1 :(得分:0)
它适用于我们。
确保正确设置装配属性。 https://msdn.microsoft.com/en-us/library/4w8c1y2s(v=vs.110).aspx
以下是我们正在做的事情。
使用Microsoft.ServiceFabric.Services.Remoting.FabricTransport; [assembly:FabricTransportServiceRemotingProvider(MaxMessageSize = 134217728)]
再次确保在创建service remoting侦听器的程序集和使用ServiceProxy调用它的程序集中可以使用它。
或者,您可以在创建侦听器时或在settings.xml配置文件中以编程方式设置最大邮件大小。有关详细信息,请参阅此处:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-secure-communication/