使用大字符串传输DataMember

时间:2014-03-25 13:56:46

标签: c# wcf

在IIS 8.0中托管的wcf-Application(.NET FW 4.0)中,我希望将具有两个大字符串的复杂DataMember作为参数发送。这些字符串最多可达20或更多MB。首先我使用transferMode = Streamed,但我总是得到错误:

  

其他信息:格式化程序在尝试反序列化消息时抛出异常:尝试时出错   反序列化参数http://tempuri.org/:request。 InnerException   消息是'反序列化类型对象时出错   QCheckerService.Parameter。最大字符串内容长度配额   读取XML数据时已超出(8192)。这个配额可能是   通过更改上的MaxStringContentLength属性来增加   创建XML阅读器时使用的XmlDictionaryReaderQuotas对象。

我在配置文件中将readerQuotas all设置为max。但是错误与XmlDictionaryReaderQuotas有关。有没有办法避免在代码中更改后面的这些配额?

我现在有点困惑,这可能是一个合适的解决方案。默认的transferMode = Buffered是正确的方法吗?

或者大字符串的传输是不可能的,我应该用另一种方式?

如果我传输小字符串,它就可以工作。这是其他配置。

客户端app.config:

<system.serviceModel>
  <client>
    <endpoint address=http://localhost:12412/Service1.svc 
              binding="basicHttpBinding"
              bindingConfiguration="BasicHttpBinding_IQChecker"
              contract="QCheckerService.IQChecker"> 
  </client>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IQChecker" 
                     maxBufferSize="2147483647" 
                     maxBufferPoolSize="2147483647" 
                     maxReceivedMessageSize="2147483647"
                     transferMode="Streamed">
        <readerQuotas maxDepth="32" 
                      maxStringContentLength="2147483647"
                      maxArrayLength="2147483647" 
                      maxBytesPerRead="2147483647" 
                      maxNameTableCharCount="2147483647" />
      </binding>
    </basicHttpBinding>
  </bindings>
</system.serviceModel>

service web.config:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <bindings>
    <basicHttpBinding>
      <binding name="Basic"
               maxReceivedMessageSize="2147483647"
               maxBufferSize="2147483647"
               maxBufferPoolSize="2147483647"
               transferMode="Streamed">
        <readerQuotas maxBytesPerRead="2147483647"
                      maxDepth="32"
                      maxStringContentLength="2147483647"
                      maxArrayLength="2147483647"
                      maxNameTableCharCount="2147483647" />
      </binding>
    </basicHttpBinding>
  </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

相关DataMember的服务接口

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "MyMethod", BodyStyle = WebMessageBodyStyle.Bare)]
ReturnValue MyMethod (Parameter request);

[DataContract]
public class Parameter: IDisposable
{
    [DataMember]
    String String1;

    [DataMember]
    String String2;

    public void SetString1(String drawing)
    {
        String1 = drawing;
    }

    public String GetString1()
    {
        return String1;
    }

    public void SetString2(String configuration)
    {
        String2 = configuration;
    }

    public String GetString2()
    {
        return String2;
    }

    public void Dispose()
    {

    }

感谢您提供一些建议。

1 个答案:

答案 0 :(得分:0)

在服务的配置文件中,您定义了一个名为“Basic”的basicHttpBinding。但是,您没有明确定义的服务的端点,因此默认情况下,框架将在服务文件的位置公开具有basicHttpBinding的端点。此默认端点将使用basicHttpBinding默认值 - 换句话说,根本不使用您定义的绑定。

解决此问题的两种方法(在WCF 4.0+中):您必须a)通过它的名称将绑定分配给显式端点(也在配置文件中定义)或b)将其设置为默认绑定对于那个传输协议。

对于选项a,您可以将一个端点添加到服务的配置文件中:

<services>
  <service name="Your service name">
    <endpoint address="" 
              binding="basicHttpBinding"
              bindingConfiguration="Basic" 
              contract="QCheckerService.IQChecker" />
  </service>
</services>

对于选项b,您可以通过在绑定定义上省略name属性来使您指定的配置成为默认配置,如下所示:

<bindings>
  <basicHttpBinding>
    <binding maxReceivedMessageSize="2147483647"
             maxBufferSize="2147483647"
             maxBufferPoolSize="2147483647"
             transferMode="Streamed">
      <readerQuotas maxBytesPerRead="2147483647"
                    maxDepth="32"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                    maxNameTableCharCount="2147483647" />
    </binding>
  </basicHttpBinding>
</bindings>

上述绑定定义将用于使用该配置文件和basicHttpBinding的所有服务。

有关默认绑定,端点和行为的详细信息,请参阅A Developer's Introduction to Windows Communication Foundation 4