2017-07-19 12 views
0

私はWCFサービスを作成していますが、WinForms Clientに接続している間は正常に動作しています。しかし私はブラウザを通してそれにアクセスしたい。いくつかのメソッドは正常に動作していますが、複数のオブジェクトを含むオブジェクトを返送しようとすると、エラーメッセージ "接続がリセットされました"が返されます...私は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

私は、(現在)webHttpBinding(RESTクライアント用)を使用しているWCFサービスのコードで同じ問題を発見しました。原因は、DataContractクラスのプロパティ "IsReference = true"でした。オブジェクトのグラフに循環参照が含まれているため、このフラグをTRUEに設定する必要がありました。このようにして、返されたレスポンスは実際のオブジェクトがシリアライズされた場合よりもはるかに少ないバイト数になります。

SOAPとその他のバインディングでは動作しますが、webHttpBindingでは動作しない理由はわかりませんが、RESTサポートを追加する必要があるため、IsReference = trueのDataContractクラスが返されたときにサービスが停止しました。

私の一時的な解決策は、元のプロパティと同じプロパティを持つが、IsReferenceプロパティを持たない別のクラスを作成することでした。私はこれをさらに調査する必要がありますが、その間に私はこれが役立つことを願っています。