这是我的服务代码。我发布了一个错误,就像所有最佳实践文章建议的那样 - 以WebFaultException的形式出现。
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class API
{
[OperationContract]
[WebGet()]
public int MyMethod()
{
throw new WebFaultException<string>("TESTERROR", HttpStatusCode.BadRequest);
}
}
现在,当我向http://localhost:1389/API.svc/MyMethod
发送请求时,我得到的就是这个JSON对象:
{“ExceptionDetail”:null,“ExceptionType”:null,“Message”:“由于内部错误,服务器无法处理请求。有关错误的更多信息,请打开IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute)或者从服务器上的配置行为),以便将异常信息发送回客户端,或者根据Microsoft .NET Framework 3.0 SDK文档打开跟踪并检查服务器跟踪日志。“,”StackTrace“:null}
我尝试在我的web.config中启用includeExceptionDetailInFaults
,消息确实有所改变,但我仍然没有在任何地方看到我的“TESTERROR”!
答案 0 :(得分:1)
我认为发生的事情是你没有发生任何回复,只有回复代码。所以你的服务器在没有任何额外信息的情况下投入500。您仍然可以通过将异常详细信息输出到日志文件来使用它。
我通常做的是创建一个可序列化的响应对象,其中包含一条消息以及我想要返回给客户端的任何代码。然后我捕获异常,构建响应对象并将其返回给客户端。然后,客户端接收可以读取的xml有效负载。因此,如果它不是200(OK),那么我认为它是一个错误并显示相应的消息(或我在xml中包含的详细信息。
<ServiceError>
<ServerCode>
500
</ServerCode>
<ApplicationCode>
9100
</ApplicationCode>
<Message>
API key is expired.
</Message>
</ServiceError>
更新:
就JSON标准而言,我从未见过实际的文档标准。我所看到的是一种事实上的标准,或者更确切地说是一种趋势:
{
"status": "success", //or "failed"
"data": {
//any app specific payload here
},
"message": null //or additional info here (i.e. exception details)
}
答案 1 :(得分:1)
好的,事实证明你必须将它添加到.svc文件中:Factory="System.ServiceModel.Activation.WebServiceHostFactory"
从web.config中删除<behaviors>
部分,只留下:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="MyAPI"><endpoint address="" binding="webHttpBinding"/></service>
</services>
</system.serviceModel>
答案 2 :(得分:0)
我遇到了同样的问题,并调试了wcf库,ExeptionDetail来自WebScriptEnablingBehavior中的这些行:
ExceptionDetail originalFaultDetail = fault.GetDetail<ExceptionDetail>();
它尝试反序列化设置为ExceptionDetail类型对象的错误,但失败。 创建WebFaultException时使用ExceptionDetail类型:
throw new WebFaultException<ExceptionDetail>(new ExceptionDetail(new Exception("TESTERROR")), HttpStatusCode.BadRequest);