处理大对象图时,客户端模糊的WCF错误

时间:2012-03-28 12:55:33

标签: wcf

我正在从SharePoint网站调用WCF服务,并在返回相对较大的对象图时,在客户端上收到错误信息。

在调试服务时,我可以看到它正确地构造了对象,并且该方法正确地返回了最终对象(具有其他对象的列表)。但是在客户端,我在服务方法调用上遇到异常。

在大多数情况下,您的服务/方法都可以正常工作。以下是服务配置(格式错误的道歉)

服务配置:

<system.serviceModel>
<services>
<service behaviorConfiguration="StandardServiceBehaviour" name="Thd.K2.Web.DataServicesLibrary.Common.Services.AdminService">

            <endpoint address="soap" binding="basicHttpBinding" name="AdminService" contract="Thd.K2.Web.DataServicesLibrary.Common.Interfaces.IAdminService" />
            <endpoint address="mex" binding="mexHttpBinding" name="Metadata" contract="IMetadataExchange" kind="mexEndpoint" endpointConfiguration="" />
        </service>
</services>
<behaviors>
    <serviceBehaviors>
          <behavior name="StandardServiceBehaviour">
                  <serviceMetadata httpsGetEnabled="false" />
                  <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>                
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <basicHttpBinding>
            <binding name="customBinding" hostNameComparisonMode="StrongWildcard" receiveTimeout="00:10:00" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00" maxReceivedMessageSize="1000000" maxBufferSize="1000000" maxBufferPoolSize="1000000" transferMode="Buffered" messageEncoding="Text" textEncoding="utf-8" bypassProxyOnLocal="false" useDefaultWebProxy="true">
                <readerQuotas maxDepth="2147483647" maxStringContentLength="214748364" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                <security mode="Transport" />
            </binding>
        </basicHttpBinding>
        <webHttpBinding>
          <binding name="webBinding" bypassProxyOnLocal="true" useDefaultWebProxy="false" hostNameComparisonMode="WeakWildcard" sendTimeout="00:05:00" openTimeout="00:05:00" receiveTimeout="00:05:00" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647">
            <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" />
            <security mode="Transport">
            </security>
          </binding>
        </webHttpBinding>
    </bindings>
</system.serviceModel>

创建服务实例的客户端方法

public static TServiceType GetServiceClient<TServiceType>(ConnStringsType connectionStringType, Page callingPage)
        where TServiceType : class
    {
        var spUrl = GetConnectionString(connectionStringType, callingPage);

    var result = new BasicHttpBinding(BasicHttpSecurityMode.None);            
        if(spUrl.ToLower().StartsWith("https"))
        {
            result = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
        }            
        result.MaxReceivedMessageSize = int.MaxValue - 1;
        result.MaxBufferSize = int.MaxValue-1;
        if (!string.IsNullOrEmpty(spUrl))
        {
            return (TServiceType)Activator.CreateInstance(typeof(TServiceType), result, new EndpointAddress(spUrl));
        }
        return null;
    }

错误:

接收到http://localhost:90/AdminService.svc/soap的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。请参阅服务器日志以获取更多详 堆栈:

服务器堆栈跟踪:    在System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException,HttpWebRequest request,HttpAbortReason abortReason)    at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)    在System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan超时)    在System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan超时)    在System.ServiceModel.Channels.ServiceChannel.Call(String action,Boolean oneway,ProxyOperationRuntime operation,Object [] ins,Object [] outs,TimeSpan timeout)    在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime操作)    在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

在[0]处重新抛出异常:    在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)    在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&amp; msgData,Int32 type)    at IAdminService.GetBlackoutPeriodsByDescription(String lang,String description)    at AdminServiceClient.GetBlackoutPeriodsByDescription(String lang,String description)    在EditBlackoutDates.LoadBlackout(字符串描述)

2 个答案:

答案 0 :(得分:0)

我认为这是关于MaxItemsInObjectGraph财产的。 Here是解决类似问题的答案。

答案 1 :(得分:0)

@paramosh - 非常感谢!!!

这就是诀窍。对于其他参考,我实际上使用的是非RESTful WCF服务。因此我修改了解决方案如下 在web svc方法调用之前调用以下函数:

private void ExpandObjectGraphItems(AdminServiceClient svc)
    {
        var operations = svc.Endpoint.Contract.Operations;
        foreach (var operation in operations)
        {
            var dataContractBehavior = operation.Behaviors.Find<System.ServiceModel.Description.DataContractSerializerOperationBehavior>();
            if (dataContractBehavior != null)
            {
                dataContractBehavior.MaxItemsInObjectGraph = int.MaxValue;
            }
        }
    }

为服务配置添加了以下属性:

<behavior name="StandardServiceBehaviour">
                <dataContractSerializer maxItemsInObjectGraph="2147483646"/>