奇怪的IIS / WCF Web服务问题

时间:2018-11-30 06:05:48

标签: rest wcf iis soap iis-8

Windows Server 2012-IIS 8.x

我在IIS中部署了WCF Web服务(DLL),它支持基于https的SOAP和REST。从Comodo安装了SSL证书。

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

软件开发多么令人沮丧。我发誓我很快将需要换发疗法。我终于找到了导致问题的原因,并且在大多数情况下,归结为我的编程错误。令人沮丧的是,当您没有任何错误消息时,或者当框架抛出一个笼统的错误而无法提供任何错误提示时。

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

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