当对象属性不正确时,Wcf(400)Bad Request

时间:2014-04-07 13:14:18

标签: c# wcf response

我有一个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));
}

' 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响应。

这可能吗?

4 个答案:

答案 0 :(得分:3)

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>

所有这些都来自this site

答案 1 :(得分:1)

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

如果您的客户发送错误信息。您必须使用消息检查器: MSDNLogging all WCF messages

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

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

答案 2 :(得分:0)

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

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可以转换为Object&#34; TypeRequest&#34;但你的xml无效。

希望有所帮助

答案 3 :(得分:0)

我认为你需要一些方法拦截器并在那里编写预期的逻辑。

这是http://msdn.microsoft.com/en-us/magazine/cc163302.aspx

的优质资源