C# 对象属性不正确时Wcf(400)错误请求

C# 对象属性不正确时Wcf(400)错误请求,c#,wcf,response,C#,Wcf,Response,我有一个Wcf(支持ajax的)服务,它接受方法调用的对象。我的Wcf方法如下所示 [OperationContract] [XmlSerializerFormat] [WebInvoke(Method = "POST", UriTemplate = "/XML/GetTypes", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml)] XElement XMLGetTypes(TypeRequ

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

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

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


这是可能的吗?

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

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服务需要可以转换为对象“TypeRequest”类型的xml,但您的xml无效


希望这有帮助

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


这里有一个很好的资源

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));
        }
    }
公共类ErrorHttpHandler:IHttpHandler
{
公共布尔可重用
{
获取{return true;}
}
公共void ProcessRequest(HttpContext上下文)
{
if(context.Request.QueryString.Count==0)
返回;
字符串strStatusCode=context.Request.QueryString[0]。拆分(“;”).FirstOrDefault()??“500”;
int statusCode=500;
int.TryParse(strStatusCode,out statusCode);
字符串消息=“未处理的服务器错误。”;
开关(状态代码)
{
案例400:
message=“请求错误。”;
打破
案例404:
message=“未找到项目。”;
打破
}
context.Response.StatusCode=状态码;
Write(string.Format(“{0}”,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客户端)提供参数检查器属性。因此,在通过验证之前不会发送消息,这可以节省您的通信量。以下是一个链接:

万一你的客户给你发错了信息。您必须使用消息检查器: ,

下面是更好的例子:

您必须在ReceiveRequest之后对方法给予更多关注。请注意,需要创建邮件的缓冲副本,然后处理邮件的一个副本,然后返回另一个副本。

您从WCF中得到的错误是什么?System.Net.WebException:远程服务器返回了一个错误:(400)错误请求,因为请求传递的是字符串而不是整数,所以有更好的解决方案吗?据我所知,没有办法将不符合服务期望属性的对象接受到服务中,这意味着在您有机会对方法进行任何验证之前,服务已经创建了错误。
int
不是可为空的类型,使用
as
运算符进行强制转换将不会编译。无论如何,它不能通过类型转换转换转换为字符串。您需要使用类似于
Convert.ToInt32()
的方法,并在异常失败时捕获异常。@JamesT我遇到的问题是这是一个示例对象。我有很多对象,所以使用像Convert这样的东西不是一个好的解决方案。我想你也可以使用int.tryParse(string)