【问题标题】:Unable to Override MaxRecievedMessageSize from Code Behind无法从后面的代码中覆盖 MaxRecievedMessageSize
【发布时间】:2014-02-13 17:26:52
【问题描述】:

我托管一个 WCF REST 服务并在同一个 webrole 中使用它。配置在代码隐藏中完成。我已经尝试了很多解决方案并在此发布,

但我无法弄清楚为什么我无法覆盖 MaxRecievedMessageSize 。如果大小超过 64kb。它抛出异常。

WebChannelFactory<X> channelFactory;

                if (!ChannelFactories.ContainsKey(endpointName.ToString(CultureInfo.InvariantCulture)))
                {
                    channelFactory = new WebChannelFactory<X>(new Uri(endpointName));

                    lock (ChannelFactories.SyncRoot)
                    {
                        ChannelFactories[endpointName.ToString(CultureInfo.InvariantCulture)] = channelFactory;
                    }
                }
                else
                {
                    channelFactory =
                        ChannelFactories[endpointName.ToString(CultureInfo.InvariantCulture)] as
                        WebChannelFactory<X>;
                }
                //Configure The Size here

                if (channelFactory != null)
                {

                    channelFactory.Endpoint.Binding = new WebHttpBinding
                        {

                            MaxReceivedMessageSize = 2147483647,
                            MaxBufferSize = 2147483647,
                            ReaderQuotas =new XmlDictionaryReaderQuotas()
                                {
                                    MaxArrayLength = 2147483647,
                                    MaxStringContentLength = 2147483647,
                                    MaxDepth = 2147483647,
                                    MaxNameTableCharCount = 2147483647,
                                    MaxBytesPerRead = 2147483647
                                },
                            MaxBufferPoolSize = 2147483647,
                            OpenTimeout = new TimeSpan(0, 0, 10, 0),
                            ReceiveTimeout = new TimeSpan(0, 0, 10, 0),
                            TransferMode = TransferMode.Streamed,
                            CloseTimeout = new TimeSpan(0, 0, 10, 0),
                            SendTimeout = new TimeSpan(0, 0, 10, 0)
                        };

和 Web.Config

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="false" logMalformedMessages="true" maxMessagesToLog="5000" maxSizeOfMessageToLog="2000"></messageLogging>
    </diagnostics>
    <standardEndpoints></standardEndpoints>
  </system.serviceModel>

【问题讨论】:

    标签: c# wcf asp.net-mvc-4 .net-4.5


    【解决方案1】:

    我不相信您可以在创建 WebChannelFactory 后更改它的绑定(但我不能 100% 确定这一点)。创建工厂后,您可以更改的东西很少。很可能它使用WebHttpBinding 的默认值,这就是您获得下限的原因。

    尝试创建绑定并将其传递给WebChannelFactory&lt;T&gt; 构造函数重载之一,如下所示:

    WebHttpBinding myBinding = new WebHttpBinding
                               {
                                   MaxReceivedMessageSize = 2147483647,
                                   MaxBufferSize = 2147483647,
                                   ReaderQuotas =new XmlDictionaryReaderQuotas()
                                   {
                                       MaxArrayLength = 2147483647,
                                       MaxStringContentLength = 2147483647,
                                       MaxDepth = 2147483647,
                                       MaxNameTableCharCount = 2147483647,
                                       MaxBytesPerRead = 2147483647
                                   },
                                   MaxBufferPoolSize = 2147483647,
                                   OpenTimeout = new TimeSpan(0, 0, 10, 0),
                                   ReceiveTimeout = new TimeSpan(0, 0, 10, 0),
                                   TransferMode = TransferMode.Streamed,
                                   CloseTimeout = new TimeSpan(0, 0, 10, 0),
                                   SendTimeout = new TimeSpan(0, 0, 10, 0)
                               };
    
    if (!ChannelFactories.ContainsKey(endpointName.ToString(CultureInfo.InvariantCulture)))
    {
    
        // Pass the binding created above and the URI into the constructor
        channelFactory = new WebChannelFactory<X>(myBinding, new Uri(endpointName));
    
        lock (ChannelFactories.SyncRoot)
        {
            ChannelFactories[endpointName.ToString(CultureInfo.InvariantCulture)] = channelFactory;
        }
    }
    else
    {
        channelFactory = ChannelFactories[endpointName.ToString(CultureInfo.InvariantCulture)] as WebChannelFactory<X>;
    }
    

    在上面的代码中,我使用了 WebFactoryChannel&lt;T&gt; 的重载,它接受一个绑定和一个 URI - WebChannelFactory&lt;TChannel&gt; Constructor (Binding, Uri)

    【讨论】:

      猜你喜欢
      • 2013-12-07
      • 2013-07-21
      • 2011-02-27
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多