我有一个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响应。
这可能吗?
答案 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
如果您的客户发送错误信息。您必须使用消息检查器: MSDN,Logging 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)
我认为你需要一些方法拦截器并在那里编写预期的逻辑。
的优质资源