WCF连接重置
问题描述:
我创建了一个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>
答
我刚刚在我正在使用的WCF服务中发现了一段代码,即(现在)正在使用webHttpBinding(对于REST客户端)。罪魁祸首是DataContract类中的属性“IsReference = true”。我需要将该标志设置为TRUE,因为对象的图形包含循环引用;这样返回的响应比真实对象被序列化的字节少得多。
我不知道为什么这与SOAP和其他绑定协同工作,但不能与webHttpBinding协同工作,但由于我需要添加REST支持,因此当返回带有IsReference = true的DataContract类时,服务停止工作。
我的临时解决方案是创建另一个具有与原始属性相同的类,但没有IsReference属性。我需要进一步调查,但同时我希望这有助于。