在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()
{
}
感谢您提供一些建议。
答案 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