【问题标题】:Web service throwing exception and doesn't return a responseWeb 服务抛出异常并且不返回响应
【发布时间】:2013-08-07 23:45:14
【问题描述】:

我正在从控制台应用程序调用 Web 服务 (https://gw.sam.gov/epls/services/EPLSSearchWebService?wsdl)。我只需要运行带有 SSN 和名称的“doSsnSearch”并确认是否有成功的返回结果。在我的 30 条测试记录中,有 29 条没有返回任何内容,但是当有有效响应时,服务会抛出异常并且永远不会返回响应。例外情况如下:

Error in deserializing body of reply message for operation 'doSsnSearch'.

内部异常是:

{"Cannot assign object of type System.String[] to an object of type System.String."}

我正在使用服务引用来添加 WSDL,并尝试增加 readerquotas 中所有内容的大小以及我在配置端能想到的所有其他内容。最糟糕的是我之前修复过它,但现在我忘记了我做了什么:\

我已确认 Web 服务调用与我通过使用 SoapUI 提供的数据一起工作,并且我能够获得有效的响应。

这是调用代码:

var client = new EPLSSearchWebServiceClient();
var query = new OperationSsnSearch 
{
  exactName = "XXX",
  ssnOrTin = "xxxxxxxxx"
};

var response = Client.doSsnSearch(query);  <--- exception is thrown here

这是我的 app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="EPLSSearchWebServiceSoapBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="999999" maxBufferPoolSize="999999" maxReceivedMessageSize="999999" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
      <readerQuotas maxDepth="999999" maxStringContentLength="999999" maxArrayLength="999999" maxBytesPerRead="999999" maxNameTableCharCount="999999" />
      <security mode="Transport" />
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="https://gw.sam.gov/epls/services/EPLSSearchWebService" binding="basicHttpBinding" bindingConfiguration="EPLSSearchWebServiceSoapBinding"
            contract="SAMWebServices.EPLSSearchWebService" name="EPLSSearchWebService"/>
</client>
</system.serviceModel>
...

非常感谢任何建议。

谢谢

编辑:这是我正在调用的服务的主体:

 public SAM_Caller.Console_App.SAMWebServices.EPLSSearchResponse doSsnSearch(SAM_Caller.Console_App.SAMWebServices.OperationSsnSearch query) {
        SAM_Caller.Console_App.SAMWebServices.doSsnSearchRequest inValue = new SAM_Caller.Console_App.SAMWebServices.doSsnSearchRequest();
        inValue.query = query;
        SAM_Caller.Console_App.SAMWebServices.doSsnSearchResponse retVal = ((SAM_Caller.Console_App.SAMWebServices.EPLSSearchWebService)(this)).doSsnSearch(inValue);
        return retVal.doSsnSearchReturn;
    }

【问题讨论】:

    标签: wcf web-services exception


    【解决方案1】:

    您应该获得有关错误发生位置的更具体信息。它是在服务器端还是客户端? (我假设客户)。客户端发送请求并获得响应(使用 fiddler 进行检查)还是在发送之前发生错误?

    接下来,您要确保已从最新的 WSDL 版本生成代理。自从您生成代理后,服务器可能发生了变化,因此您应该发布更新。

    最后,这可能是 WCF 代理生成中的错误。如果你用我之前的建议不能解决,那么请在这里发布响应soap和服务代理的代码(reference.cs)。

    【讨论】:

    • 服务器上的错误。没有任何东西返回给客户。我有最新的 WSDL。我将在上面发布服务的代码
    • 哇,你是对的。看起来他们在最近几天内更改了 WSDL 的地址。谢谢,伙计。
    【解决方案2】:

    Exception 清楚地说明了您的问题。您试图将字符串数组分配给字符串。请检查您正在执行此作业的代码。
    函数调用很可能返回一个字符串数组,因此首先检查该函数的返回类型。 检查您分配给响应的内容。

    我不完全知道您使用哪种语言进行编码,但会告诉您可以参考的最简单方法。如果你只检查这个最简单的事情来解决这个问题,我会非常高兴。

    【讨论】:

    • 这是 C#。我用来运行此服务的所有代码都包含在此处。 Client.doSsnSearch(query) 是第三方代码,我无法介入。异常在函数返回之前被抛出,所以'response'永远不会得到值。
    • 好的。不要介入,但如果方法有效,请检查您自己的满意度。
    • 我想说的是,正在执行此操作的代码是我无法查看的分配。当没有结果时,不抛出异常,但是对于特定的有名字和ssn的查询,当有结果要返回时,抛出异常。
    • 好的,那么您应该将变量响应指定为字符串数组。例如 String[] response = Client.doSsnSearch(query);当没有结果时,将分配 Null 值,这对于任何对象都是有效值。我这么认为。
    • WSDL 提供了特定的返回类型(EPLSSearchResponse),所以我只能在我的返回值是那个或“var”时才能编译
    猜你喜欢
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2017-06-15
    • 2017-03-10
    相关资源
    最近更新 更多