2017-07-19 106 views
0

我創建了一個WCF服務,並且在將它連接到WinForms客戶端時它工作正常。但我想通過瀏覽器訪問它。有些方法工作正常,但是當我試圖發送包含多個對象的對象時,它會返回錯誤消息「連接已重置」......我試圖用ARC和JQuery Ajax測試我的服務,並且所有的情況下,我收到了同樣的錯誤。WCF連接重置

我幾乎忘記告訴你,這個問題只發生在我創建Period屬性的實例時。如果我清楚地返回對象,那麼我沒有任何問題。

我分享給你一個基於原始代碼的測試。我希望你能幫助我。

WCF服務

​​

預註冊響應

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 
using System.ServiceModel.Web; 
using MercSoft.Conservatorio.DataModels; 
using System.Runtime.Serialization; 
using MercSoft.Conservatorio.Request; 

namespace MercSoft.Conservatorio.Response 
{ 
    [DataContract] 
    public class PreRegisterResponse : BaseResponse 
    { 
      [DataMember] 
      public PreRegisterDataModel Period { get; set; } 

      public PreRegisterResponse() 
       : base() 
      { 
      } 
    } 
} 

PreRegisterDataModel

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 

namespace MercSoft.Conservatorio.DataModels 
{ 
    [DataContract(IsReference=true)] 
    public class SystemPeriodsDataModel 
    { 
     [DataMember] 
     public int Id { get; set; } 
     [DataMember] 
     public int PeriodType { get; set; } 
     [DataMember] 
     public String PeriodTypeString { get; set; } 
     [DataMember] 
     public DateTime? StartDate { get; set; } 
     [DataMember] 
     public DateTime? EndDate { get; set; } 
     [DataMember] 
     public String DatePeriod { get; set; } 
     [DataMember] 
     public bool WithInstument { get; set; } //Pre-register ONLY 
     [DataMember] 
     public bool Active { get; set; } 
    } 
} 

WebConfig

<?xml version="1.0"?> 
     <configuration> 

      <appSettings> 
      <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
      </appSettings> 
      <system.web> 
      <compilation debug="true" targetFramework="4.5" /> 
      <httpRuntime targetFramework="4.5"/> 
      </system.web> 
      <system.serviceModel> 
      <services> 
       <service name="Mercsoft.Conserv.WSv2.Conservatorio"> 
       <endpoint address="" behaviorConfiguration="Mercsoft.Conserv.WSv2.ConservatorioAspNetAjaxBehavior" 
      binding="webHttpBinding" contract="Mercsoft.Conserv.WSv2.Conservatorio" /> 
       </service> 
     </services> 
     <behaviors> 
      <endpointBehaviors> 
      <behavior name="Mercsoft.Conserv.WSv2.ConservatorioAspNetAjaxBehavior"> 
       <enableWebScript /> 
      </behavior> 
      </endpointBehaviors> 
      <serviceBehaviors> 
      <behavior name=""> 
       <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <protocolMapping> 
      <add binding="basicHttpsBinding" scheme="https" /> 
     </protocolMapping>  
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
     </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
     To browse web app root directory during debugging, set the value below to true. 
     Set to false before deployment to avoid disclosing web app folder information. 
     --> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 

</configuration> 

回答

0

我剛剛在我正在使用的WCF服務中發現了一段代碼,即(現在)正在使用webHttpBinding(對於REST客戶端)。罪魁禍首是DataContract類中的屬性「IsReference = true」。我需要將該標誌設置爲TRUE,因爲對象的圖形包含循環引用;這樣返回的響應比真實對象被序列化的字節少得多。

我不知道爲什麼這與SOAP和其他綁定協同工作,但不能與webHttpBinding協同工作,但由於我需要添加REST支持,因此當返回帶有IsReference = true的DataContract類時,服務停止工作。

我的臨時解決方案是創建另一個具有與原始屬性相同的類,但沒有IsReference屬性。我需要進一步調查,但同時我希望這有助於。