传输带有大字符串的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()
{
}
谢谢你的建议
在您的服务的配置文件中,您已经定义了一个名称为"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