在WCF中的ASP.NET RESTful webservice中返回错误的最佳实践

3
这是我的服务代码。我像所有最佳实践文章建议的那样抛出错误 - 以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个回答

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>

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)
}

我知道我可以构建任何我想要的东西,例如使用HttpContext.Current... 但是在一个JSON RESTful WCF服务中,有没有官方文档规定的返回错误的方式? - Alex from Jitbit
我认为没有官方标准响应,但有一个常见的响应(编辑了我的答案)。 - Sinaesthetic
谢谢修改,但我的意思是——是否有任何 .NET 中内置的机制允许返回这种类型的数据。猜想没有……好的,我会等几天再关闭问题,谢谢。 - Alex from Jitbit

0

我遇到了同样的问题并调试了wcf库,ExeptionDetail来自WebScriptEnablingBehavior中的以下行:

ExceptionDetail originalFaultDetail = fault.GetDetail<ExceptionDetail>();

它尝试将您设置为ExceptionDetail类型对象的错误反序列化,并失败了。 在创建WebFaultException时使用ExceptionDetail类型:

throw new WebFaultException<ExceptionDetail>(new ExceptionDetail(new Exception("TESTERROR")), HttpStatusCode.BadRequest);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接