【问题标题】:Send large stream to ServiceFabric Service将大流发送到 ServiceFabric 服务
【发布时间】:2017-08-24 17:48:35
【问题描述】:

我有一个托管 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
}

它适用于小于 3 MB 的文件。然而,对于大于 5 MB 的文件,调用不起作用。我们从不继续// Line after// Error handling// Log line

我确实在控制器程序集、WebAPI 服务程序集和 Service2 程序集上添加了[assembly: FabricTransportServiceRemotingProvider(MaxMessageSize = int.MaxValue)]。 Service2 接口具有[OperationContract][ServiceContract] 属性。

我还尝试发送byte[] 而不是MemoryStream。问题还是一样。

【问题讨论】:

    标签: c# stream azure-service-fabric


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      它对我们来说很好用。

      确保正确设置程序集属性。 https://msdn.microsoft.com/en-us/library/4w8c1y2s(v=vs.110).aspx

      这就是我们正在做的事情。

      使用 Microsoft.ServiceFabric.Services.Remoting.FabricTransport; [组装:FabricTransportServiceRemotingProvider(MaxMessageSize = 134217728)]

      再次确保这在创建服务远程侦听器的程序集和使用 ServiceProxy 调用它的程序集中可用。

      或者,您可以在创建侦听器时以编程方式或在 settings.xml 配置文件中设置最大消息大小。有关更多信息,请参见此处:https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-services-secure-communication/

      【讨论】:

      • 你使用的是HttpListener还是SF internal remoting?
      • FabricTransport 是 SF 内部远程处理
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 2016-06-20
      • 2015-05-03
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多