[英]Wcf (400) Bad Request when object properties are incorrect
我有一個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響應。
這可能嗎 ?
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客戶端)提供。 因此,在通過驗證之前不會發送消息,這可以節省流量。 這是一個鏈接: 使用Interceptor進行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可以轉換為Object“TypeRequest”的類型,但您的xml無效。
希望有所幫助
我認為你需要一些方法攔截器並在那里寫出預期的邏輯。
這是一個很好的資源http://msdn.microsoft.com/en-us/magazine/cc163302.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.