C# 对象属性不正确时Wcf(400)错误请求
我有一个Wcf(支持ajax的)服务,它接受方法调用的对象。我的Wcf方法如下所示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
[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)