WCF Rest ERR_CONNECTION_RESET 响应不大

Posted

技术标签:

【中文标题】WCF Rest ERR_CONNECTION_RESET 响应不大【英文标题】:WCF Rest ERR_CONNECTION_RESET not large response 【发布时间】:2014-12-18 07:10:03 【问题描述】:

错误代码非常糟糕,ERR_CONNECTION_RESET 有很多原因,我在其他问题上发现的原因与大型 Web 服务调用的 MaxRequestLength 太小有关。我返回的数据只有几 kB,所以这不是问题。

这是我的界面代码

[WebGet(RequestFormat = WebMessageFormat.Json,
  BodyStyle = WebMessageBodyStyle.WrappedRequest,
  ResponseFormat = WebMessageFormat.Json,
  UriTemplate = "GetReportByID?ReportID=ReportID")]
[OperationContract]
UsageReport GetReportByID(int ReportID);

这就是实现

public UsageReport GetReportByID(int ReportID)

    return new UsageReport(ReportID);

这是 UsageReport 的类代码

[DataContract]
public class UsageReport

 [DataMember]
List<UsageItem> RL;

  public UsageReport(int reportID)

       RL = new List<UsageItem>();

        using (SqlDataReader dr = DBUtility.ExecuteReader(cmd, "DBString"))
        
            while (dr.Read())
            

                ItemNumber = dr["ItemID"] as int? ?? 0;
                RL.Add(new UsageItem(ItemNumber));
            
            dr.Close();
        




public class UsageItem

    int ItemNumber;

    public UsageItem(int ItemNumber)
    
        this.ItemNumber = ItemNumber;

    


【问题讨论】:

【参考方案1】:

问题是我的 UsageItem 类,我缺少必要的 DataContract 和 DataMember 字段。

[DataContract]
public class UsageItem

[DataMember]
int ItemNumber;

public UsageItem(int ItemNumber)
  
    this.ItemNumber = ItemNumber;


  


【讨论】:

有没有办法使用 WCF 服务而不指定 DataContractDataMember,因为有很多类? ***.com/questions/4836683/… 这个答案声称可以,但显然这样做会失去很多好处。 请检查我的问题,我想同时使用JSON.NetWCF。 ***.com/questions/29754874/… 非常感谢,DaneEdw。我浪费了 4 个小时试图找出我的连接被重置的原因。你的回答救了我。 如果将 DataMember 应用于属性,它必须包含一个 set 才能序列化(即,它不能是只读的)。提示:集合可以为空;)【参考方案2】:

我想添加一个与服务器端使用WCF的情况相关的解决方案:

    diagnostics 添加到web.config(取自here):

       <?xml version="1.0" encoding="UTF-8"?>
       <configuration>
         <system.diagnostics>
           <sources>
              <source name="System.Net" switchValue="Verbose">
                  <listeners>
                      <add name="SystemNetTrace"/>
                  </listeners>
              </source>
              <source name="System.ServiceModel" switchValue="Verbose, ActivityTracing" propagateActivity="true">
                  <listeners>
                      <add name="wcftrace" />
                  </listeners>
              </source>
              <source name="System.ServiceModel.MessageLogging" switchValue="Verbose, ActivityTracing">       
                  <listeners>
                      <add name="wcfmessages" />
                  </listeners>
              </source>
              <source name="System.Runtime.Serialization" switchValue="Verbose">
                  <listeners>
                      <add name="wcfmessages" />
                  </listeners>
              </source>
           </sources>
           <sharedListeners> 
               <add name="SystemNetTrace" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, Callstack" initializeData="C:\Traces\System_Net.txt" />
               <add name="wcftrace" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, Callstack" initializeData="C:\Traces\WCFTrace.svclog" />
               <add name="wcfmessages" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, Callstack" initializeData="C:\Traces\WCFMessages.svclog" />
           </sharedListeners>
           <trace autoflush="true" />
         </system.diagnostics>
       </configuration>
    

    重现错误,然后转到跟踪文件夹(在此示例中为C:\Traces)。那里将有 2 个svclog 文件:WCFMessages.svclogWCFTrace.svclog

    打开名为WCFMessages.svclog 的文件。将打开一个“Microsoft 服务跟踪查看器”窗口,以红色显示错误。 如果没有显示错误,打开WCFTrace.svclog,错误(红色)就会出现。

就我而言,这是一个System.Runtime.Serialization 错误,因为缺少DataContract 属性。

【讨论】:

以上是关于WCF Rest ERR_CONNECTION_RESET 响应不大的主要内容,如果未能解决你的问题,请参考以下文章

WCF + REST,增加 MaxStringContentLength

如何从基于 REST 的 WCF 服务中读取授权标头?

WCF 4.0 REST 用户名密码认证

用于 Xamarin 表单的 Rest + WCF 集成

WCF 服务的 REST / SOAP 端点

如何在 REST 模式下使用 WCF 服务?