【发布时间】:2011-06-09 19:32:09
【问题描述】:
我有一个 RESTful WCF 服务,但我收到以下错误:对象图中可以序列化或反序列化的最大项目数是“65536”。更改对象图或增加 MaxItemsInObjectGraph 配额。
我以为我已经解决了这个问题,但显然没有。这是我的代码:
我使用一个使用自定义工厂的 .SVC 文件,如下所示:
<%@ ServiceHost Language="C#" Debug="true" Service="myService" Factory="myCustomWebServiceHostFactory" %>
这是自定义工厂的代码
public class myCustomWebServiceHost : WebServiceHost
{
public myCustomWebServiceHost()
{
}
public myCustomWebServiceHost(object singletonInstance, params Uri[] baseAddresses)
: base(singletonInstance, baseAddresses)
{
}
public myCustomWebServiceHost(Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses)
{
}
protected override void OnOpening()
{
foreach (var endpoint in Description.Endpoints)
{
var binding = endpoint.Binding as WebHttpBinding;
if (binding != null)
{
const int fiveMegaBytes = 5242880;
binding.MaxReceivedMessageSize = fiveMegaBytes;
binding.MaxBufferSize = fiveMegaBytes;
binding.MaxBufferPoolSize = fiveMegaBytes;
}
}
base.OnOpening();
}
}
class myCustomWebServiceHostFactory : WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new myCustomWebServiceHost(serviceType, baseAddresses);
}
}
服务:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract]
[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)]
public class myService
{
...service implementation code goes here
}
客户:
public class myClient
{
WebChannelFactory<IMyService> cf;
IMyService channel;
public myClient()
{
WebHttpBinding _binding = new WebHttpBinding();
_binding.MaxBufferPoolSize = 5000000;
_binding.MaxBufferSize = 5000000;
_binding.MaxReceivedMessageSize = 5000000;
_binding.TransferMode = TransferMode.Streamed;
_binding.ReceiveTimeout = new TimeSpan(0, 0, 30);
_binding.ReaderQuotas.MaxArrayLength = 5000000;
Uri _uri = new Uri("http://myserviceurl");
cf = new WebChannelFactory<IMyService>(_binding, _uri);
channel = cf.CreateChannel();
foreach (OperationDescription op in cf.Endpoint.Contract.Operations)
{
var dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>();
if (dataContractBehavior != null)
{
dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
}
}
}
...client implementation code goes here
}
更新:我做了一些故障排除。似乎序列化部分在服务器上运行良好。我能够从浏览器执行 GET 并以 XML 格式接收所有数据。所以这很好。似乎是导致错误的反序列化部分。如果您查看上面的 myClient 代码,您将看到我如何尝试为 DataContractSerializer 行为设置 MaxItemsInObjectGraph 属性。我这样做对吗?
【问题讨论】:
-
我在某处读到在属性中设置
MaxItemsInObjectGraph不起作用。尝试在配置中设置它 - 它是称为dataContractSerializer的服务行为。 -
好的。这有帮助。但这就是我感到困惑的地方。据我所知,因为我使用的是 SVC 文件和自定义工厂,我的实现将忽略我的配置文件中的任何设置。所以我不知道如何在代码中设置行为。
-
仅供参考 - 这是我找到我实施的解决方案的地方:stackoverflow.com/questions/4812668/…
-
在工厂或自定义服务主机的代码中设置行为可能与使用属性具有相同的效果,因为您将在服务描述中搜索行为并更改其配置。我真的不确定我之前的陈述是否正确,但我记得我读到过关于此的一些问题。