从WCF中的ASP.NET RESTful Web服务返回错误的最佳实践

时间:2012-10-25 20:09:50

标签: asp.net wcf

这是我的服务代码。我发布了一个错误,就像所有最佳实践文章建议的那样 - 以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”!

3 个答案:

答案 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);