将大型流发送到ServiceFabric服务

时间:2017-03-30 16:56:44

标签: c# stream azure-service-fabric

我有一个托管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。问题仍然存在。

2 个答案:

答案 0 :(得分:1)

如果它是StatefulService并且你使用一些ReliableDictionary和大量数据,当SF复制你的字典数据时,它可能会导致类似的问题。

您可以设置另外两个设置来阻止这种情况:

  • 创建服务实例时设置MaxReplicationMessageSize。
  • 使用自定义FabricTransportListenerSettings初始化ServiceReplicaListener:MaxMessageSize

代码:

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/