奇怪的 IIS/WCF Web 服务问题

Strange IIS/WCF Web Service Issue

Windows 服务器 2012 - IIS 8.x

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

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

但是有一些 REST 方法无一例外地失败了。在 Chrome 浏览器中,我收到一条错误消息:"This site can't be reached." 在 Postman 中,我收到一条错误消息:"Could not get any response."

当我检查 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 无关。我还在 Web 配置中添加了一个跟踪侦听器,但从未创建该文件。

<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 提出了一个支持问题,该问题已升级为他们的一位高级工程师。他们花了两天时间研究这个问题,仍然没有解决办法。他们告诉我他们以前从未见过这个!

我尝试使用您的代码并在本地进行测试,看起来一切正常。即使方法 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" />

或者直接构建集合return,解决后端数据查询问题

要启用 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>

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

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

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