WCF (400) 对象属性不正确时出错的请求

本文关键字:出错 请求 不正确 属性 对象 WCF | 更新日期: 2023-09-27 17:57:03

我有一个Wcf(启用ajax)服务,它接受方法调用的对象。 我的 Wcf 方法如下所示;

[OperationContract]
[XmlSerializerFormat]
[WebInvoke(Method = "POST", UriTemplate = "/XML/GetTypes", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)]
XElement XMLGetTypes(TypeRequest TypeRequest)
{
    return Utilities.Convert.ObjectToXElement(TypeRequest.Execute(TypeRequest));
}

"类型请求"对象如下所示;

public class
{
    public int Id {get;set;}
    public string Name {get; set;}
}

我遇到的问题是,如果我调用具有无效数据的方法,例如在请求对象中;

<TypeRequest>
<Id>abc</Id>
<Name>Joe King</Name>
</TypeRequest>

如您所见,Id 应该是一个整数,但它是作为字符串传递的。 这会导致来自 Wcf 服务的错误请求 400 响应。

理想情况下,我想处理错误,并返回合适的响应。 例如,我想返回包含错误信息的 JSON 或 XML 响应。

这可能吗?

WCF (400) 对象属性不正确时出错的请求

IIS 允许您在管道中创建整体错误处理程序。 如何处理代码以及返回的内容取决于您,尽管我会小心,因为这会处理 IIS 应用程序的所有错误。

public class ErrorHttpHandler : IHttpHandler
    {
        public bool IsReusable
        {
            get { return true; }
        }
        public void ProcessRequest(HttpContext context)
        {
            if (context.Request.QueryString.Count == 0)
                return;
            string strStatusCode = context.Request.QueryString[0].Split(';').FirstOrDefault() ?? "500";
            int statusCode = 500;
            int.TryParse(strStatusCode, out statusCode);
            string message = "Unhandled server error.";
            switch (statusCode)
            {
                case 400:
                    message = "Bad request.";
                    break;
                case 404:
                    message = "Item not found.";
                    break;
            }
            context.Response.StatusCode = statusCode;
            context.Response.Write(string.Format("<Error><Message>{0}</Message></Error>", message));
        }
    }

并在 web.config 中,为要调用的处理程序添加以下代码:

<system.webServer>
    <httpErrors errorMode="Custom">
      <clear/> 
      <error statusCode="404" path="/application/ErrorHandler" responseMode="ExecuteURL"/>
      <error statusCode="400" path="/application/ErrorHandler" responseMode="ExecuteURL"/>
    </httpErrors>
    <handlers>
      <add name="ErrorHandler" path="ErrorHandler" verb="*" type="Your Application.ErrorHttpHandler, FrameworkAssembly"/>
    </handlers>
  </system.webServer>

所有这些都是从这个网站上剔除的。

您可以使用参数检查器检查参数,这将允许您抛出所需的消息的故障异常。此外,还可以向客户端(如果是 .net 客户端)提供参数检查器属性。因此,在通过验证之前不会发送消息,这可以节省流量。这是一个链接:使用侦听器的 WCF 参数验证

万一您的客户向您发送错误的信息。您必须使用消息检查器:MSDN,记录所有 WCF 消息

这是更好的例子:http://msdn.microsoft.com/en-us/library/ff647820.aspx

你必须把更多的注意力放在方法AfterReceiveRequest上。请注意,需要创建消息的缓冲副本,然后使用消息的一个副本,然后返回另一个副本。

可以

这样做,但您可能需要稍微不同,最简单的方法可能是更改传入的类型请求,如下所示

public IncomingClass
{
    public string Id {get;set;}
    public string Name {get; set;}
}

这意味着传入的数据是有效的,并且您不会收到错误 400,

然后,您可以使用

int myId = incomingClass.Id as int;
if (myId == null)
{
//put suitable error handling here
}

或者更好的是将整个函数放在 try catch 循环中,并以这种方式处理错误。我想你会发现错误发生在你进入你的函数之前。您的 WCF 服务需要可以转换为对象"类型请求"类型的 xml,但您的 xml 无效。

希望有帮助

我认为您需要一些方法拦截器并在其中编写预期的逻辑。

这是关于该 http://msdn.microsoft.com/en-us/magazine/cc163302.aspx 的良好资源