簡體   English   中英

當對象屬性不正確時,Wcf(400)Bad Request

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM