【问题标题】:Strange IIS/WCF Web Service Issue奇怪的 IIS/WCF Web 服务问题
【发布时间】:2018-11-30 06:05:47
【问题描述】:

Windows Server 2012 - IIS 8.x

我在 IIS 中部署了一个 WCF Web 服务 (DLL),它支持 SOAP 和 REST over https。 Comodo 为 SSL 安装了一个证书。

当我在 C# 应用程序中为服务创建代理时,一切正常。此外,当我从浏览器或 Postman 调用大多数 REST 方法时,它们也可以正常工作。

但有一些 REST 方法无一例外地失败。在 Chrome 浏览器中,我收到一条错误消息:“无法访问此站点。”在 Postman 中,我收到一条错误消息:“无法得到任何响应。”

当我检查 WCF 服务中的代码时,我可以看到该方法被调用并实际执行,没有任何异常,但没有返回任何内容。我还检查了 IIS 日志,似乎没有发现任何错误。

这是一个可以正常工作的方法示例:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "/GetActivityRules?agencyID={agencyID}")]
List<ActivityRule> GetActivityRules(int agencyID);

然而,这个方法失败了:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "/GetActivity?agencyID={agencyID}&userID={userID}&date={date}&view={view}")]
List<Activity> GetActivity(int agencyID, int userID, string date, string view);

以前有没有人经历过这种情况,或者知道为什么会发生这种情况或如何最好地排除故障?

更新 #1

我向 GetActivity 函数添加了代码,该函数在每次调用时都会写入日志文件。我可以看到函数每次都正确执行而没有错误,但仍然没有响应。让我想知道问题是否与 WCF 无关。我还在网络配置中添加了一个跟踪侦听器,但该文件永远不会被创建。

<system.diagnostics>
      <sources>  
            <source name="System.ServiceModel"   
                    switchValue="Information, ActivityTracing"  
                    propagateActivity="true">  
            <listeners>  
               <add name="traceListener"   
                   type="System.Diagnostics.XmlWriterTraceListener"   
                   initializeData= "C:\Samadhi\TraceLog.svclog" />  
            </listeners>  
         </source>  
      </sources>  
   </system.diagnostics>

更新 #2

我花了一周的时间来搜索、阅读和检查所有我可能做的事情,但没有结果。我向 Microsoft 提出了一个支持问题,该问题已升级到他们的一位高级工程师。他们花了两天时间研究这个问题,但仍然没有解决方案。他们告诉我他们以前从未见过这个!

【问题讨论】:

  • 我在 GetActivity 函数中添加了代码,该函数每次调用时都会写入日志文件,我可以看到该函数每次都正确执行而没有错误,但仍然没有响应。让我想知道问题是否与 WCF 无关。

标签: rest wcf iis soap iis-8


【解决方案1】:

我尝试使用您的代码并在本地对其进行测试,看起来一切正常。即使方法 2 包含多个参数,WCF 也可以接收它们。我认为问题出在其他地方。例如,如果数据量传输过大,请尝试在绑定中配置如下代码。

<binding name="mybinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" sendTimeout="00:10:00" receiveTimeout="00:10:00">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" />

或者您可以直接构造集合返回,以消除后端数据查询的问题。

【讨论】:

  • 感谢您的建议,但我的绑定配置已经设置了这些配额。如果数据包大小太大,我也会收到不同的错误。此方法(从 SOAP 调用时)仅返回大约 2kB 的数据。这太奇怪了,因为据我所知,所有其他方法都可以正常工作(SOAP 和 REST),即使使用类似或相同类型的参数。
【解决方案2】:

要启用 wcf 跟踪,您必须为 System.ServiceModel 创建源配置。这应该跟踪服务序列化:

<system.diagnostics>
<sources>
  <source name="System.ServiceModel" switchValue="Verbose" propagateActivity="true">
    <listeners>
      <add name="svc" />
    </listeners>
  </source>
</sources>

<sharedListeners>
  <add name="svc" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="DateTime" initializeData="c:\trace.svclog" />
</sharedListeners>

<trace autoflush="true" indentsize="4">
  <listeners>
    <add name="svc" />
    <remove name="Default" />
  </listeners>
</trace>
<system.diagnostics>

【讨论】:

  • 我试过这个,但它导致我的服务停止工作。
  • Windows 事件日志中有任何提示吗?请在事件查看器中检查“自定义视图”->“管理事件”
【解决方案3】:

软件开发是多么令人沮丧。我发誓我很快就会需要头发替代疗法。我终于找到了导致问题的原因,而且通常情况下,它归结为我的编程错误。令人沮丧的部分是当您没有错误消息时,或者当框架抛出一个通用错误而无法提供任何错误线索时。

问题归结为 WCF 无法返回 JSON 结果 - 无法将对象列表解析为 JSON。发生这种情况是因为未初始化的日期值超出了允许的最小值和最大值。最终结果是服务器没有响应,甚至没有错误代码。当使用 SOAP 调用相同的方法时,XML 解析得很好——只有 REST 调用失败了。

我最初在设置 WCF 跟踪时遇到了问题。由于某种原因,它导致服务停止工作。而且因为它是一个生产服务器,所以在进行配置更改时我只有有限的时间可以使用。在看到 JSON 错误消息后,我终于知道如何解决问题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-27
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多