【问题标题】:Vague WCF Error on client side when processing a large object graph处理大型对象图时客户端出现模糊的 WCF 错误
【发布时间】:2012-03-29 19:37:07
【问题描述】:

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

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

Thie 服务/方法在大多数情况下都能正常工作。以下是服务配置(格式错误表示歉意)

服务配置:

<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 请求,HttpAbortReason abortReason) 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度超时) 在 System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan 超时) 在 System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime 操作,Object[] 输入,Object[] 输出,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,ProxyOperationRuntime 操作) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 消息)

在 [0] 处重新抛出异常: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型) 在 IAdminService.GetBlackoutPeriodsByDescription(字符串语言,字符串描述) 在 AdminServiceClient.GetBlackoutPeriodsByDescription(字符串语言,字符串描述) 在 EditBlackoutDates.LoadBlackout(字符串描述)

【问题讨论】:

  • 您是否按照错误消息的提示检查了服务器日志?他们说什么?
  • 我在服务端没有注意到任何错误/异常。

标签: wcf


【解决方案1】:

我认为这与 MaxItemsInObjectGraph 属性有关。 Here 是类似问题的答案。

【讨论】:

    【解决方案2】:

    @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"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      相关资源
      最近更新 更多