首页 > 解决方案 > 在 Web Api 中接收 Post 请求时处理无效的 Body

问题描述

我有一个第三方会将 Post 请求发送到我正在制作的 Web Api 服务。

我有一个像

public returnObject PostFromThirdPartyObject(ThirdPartyObject JSONobj)
{
    // Process Object
    return returnObject;
}

当我发送正确的对象时,这工作正常。

问题是当一个无效的对象被发送时,ThirdPartyObject用空值填充。

我希望能够捕获无效对象,以便我可以记录和诊断问题,因为我不信任第三方规范。

如何处理与预期类型不匹配的 Post 正文?


编辑:用于测试的代码是否需要更改

string body = JsonConvert.SerializeObject(ThirdPartyObject);
var cfReq = (HttpWebRequest)WebRequest.Create(url);
cfReq.ContentType = "application/json";
cfReq.Method = "Post";
cfReq.ContentLength = body.Length;
var byteArray = Encoding.UTF8.GetBytes(body);
var stream = cfReq.GetRequestStream();
stream.Write(byteArray, 0, body.Length);

var httpResponse = (HttpWebResponse)cfReq.GetResponse();
var stringResponse = string.Empty;
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    stringResponse = streamReader.ReadToEnd();
}

编辑2:使用对象的解决方法确实很差,希望有人可以发布更正确的方法

public Status PostFromThirdPartyObject([FromBody] object sObject)
{
    ThirdPartyObject obj = null;
    string sRequest = null;
    try
    {
        sRequest = JsonConvert.SerializeObject(sObject);
        LogRequest(sRequest);
        var setting = new JsonSerializerSettings();
        setting.MissingMemberHandling = MissingMemberHandling.Error;
        obj = JsonConvert.DeserializeObject<ThirdPartyObject>(sRequest, setting);
    }
    catch
    {
        if (sObject != null)
        {
            return Error
        }
        else
        {
            return NullError
        }
    }
    return processThirdPartyObject(obj);
}

标签: c#jsonpostasp.net-web-api

解决方案


尝试使用 ModelState.IsValid():

public returnObject PostFromThirdPartyObject([FromBody] ThirdPartyObject JSONobj)
{
    if(!ModelState.IsValid()) {
        // Do someting
    }
    // Process Object
    return returnObject;
}

推荐阅读