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}

我尝试includeExceptionDetailInFaults在我的 web.config 中启用,消息确实发生了一些变化,但我仍然没有在任何地方看到我的“TESTERROR”!

4

3 回答 3

1

我认为正在发生的事情是你没有任何形式的回报发生,只有一个响应代码。因此,您的服务器在没有任何其他信息的情况下抛出 500。您仍然可以通过将异常详细信息输出到日志文件来使用它。

我通常做的是创建一个可序列化的响应对象,其中包含一条消息和我想要返回给客户端的任何代码。然后我捕获异常,构建响应对象并将其返回给客户端。然后客户端会收到一个可以读取的 xml 有效负载。因此,如果它不是 200(OK),那么我认为这是一个错误并显示适当的消息(或我在 xml.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)
}
于 2012-10-25T20:21:27.923 回答
1

好的,事实证明您必须将其添加到 .svc 文件中:Factory="System.ServiceModel.Activation.WebServiceHostFactory"

<behaviors>并从 web.config中删除该部分,只留下以下内容:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
        <service name="MyAPI"><endpoint address="" binding="webHttpBinding"/></service>
    </services>
</system.serviceModel>
于 2012-11-10T00:03:42.363 回答
0

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

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

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

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

于 2018-10-31T21:09:59.647 回答