传输带有大字符串的datammember

本文关键字:datammember 字符串 传输 | 更新日期: 2023-09-27 17:53:36

在wcf-Application(。我想发送一个带有两个大字符串的复杂DataMember作为参数。这些字符串可以高达20或更多MB。首先,我使用transferMode= streaming,但我总是得到错误:

附加信息:格式化程序在尝试反序列化消息时抛出异常:在尝试反序列化参数http://tempuri.org/:request。的InnerException消息是"反序列化类型的对象出错"QCheckerService.Parameter。最大字符串内容长度配额在读取XML数据时超过了(8192)。这个配额可以是的MaxStringContentLength属性增加

创建XML阅读器时使用的xmldictionaryreaderquota对象。

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

我现在有点困惑什么是合适的解决方案。默认的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>

web服务。配置:

<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>

相关datammember的服务接口

[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()
    {
    }

谢谢你的建议

传输带有大字符串的datammember

在您的服务的配置文件中,您已经定义了一个名称为"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的所有服务。

有关默认绑定,端点和行为的更多信息,请参阅开发人员介绍Windows通信基础4