Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理请求后asp.net核心rest API中的可选正文_C#_Asp.net Core - Fatal编程技术网

C# 处理请求后asp.net核心rest API中的可选正文

C# 处理请求后asp.net核心rest API中的可选正文,c#,asp.net-core,C#,Asp.net Core,我有一个API入口点,必须处理2种情况: 在第一种情况下,我并没有在body中接收对象,然后我必须返回一个200响应 在第二种情况下,我接收到一个对象,我必须通过持久化数据来处理它。例如,在这种情况下,我还返回一个200响应 我试图找到如何处理这个案子。我实现了一个EmptyBodyModelBinder类: public class EmptyBodyModelBinder<T> : IModelBinder { public async Task BindModelA

我有一个API入口点,必须处理2种情况:

  • 在第一种情况下,我并没有在body中接收对象,然后我必须返回一个200响应
  • 在第二种情况下,我接收到一个对象,我必须通过持久化数据来处理它。例如,在这种情况下,我还返回一个200响应
我试图找到如何处理这个案子。我实现了一个EmptyBodyModelBinder类:

public class EmptyBodyModelBinder<T> : IModelBinder
{
    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var stream = bindingContext.HttpContext.Request.Body;
        using var reader = new StreamReader(stream);
        var jsonbody = await reader.ReadToEndAsync();
        var obj = JsonConvert.DeserializeObject<T>(jsonbody);
        bindingContext.Result = ModelBindingResult.Success(obj);
    }
}
public类EmptyBodyModelBinder:IModelBinder
{
公共异步任务BindModelAsync(ModelBindingContext bindingContext)
{
var stream=bindingContext.HttpContext.Request.Body;
使用var reader=newstreamreader(流);
var jsonbody=await reader.ReadToEndAsync();
var obj=JsonConvert.DeserializeObject(jsonbody);
bindingContext.Result=ModelBindingResult.Success(obj);
}
}
我的问题是在我的控制器方法中实现这一点:

    [HttpPost]
    [ProducesResponseType(StatusCodes.Status201Created)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    public ActionResult<EmailPredictionResponse> HandleResponse(
        [FromBody, ModelBinder(BinderType = typeof(EmptyBodyModelBinder<MyObjectResponse>))] MyObjectResponse responses)
    {
        var itemList = response.Items.GetEnumerator();
        if (itemList.Current.Key != null)
        {
            try
            {
                while (itemList.MoveNext())
                {
                    _logger.LogError("Key: {itemList.Current.Key} - Value:  {itemList.Current.Value}", itemList.Current.Key, itemList.Current.Value);

                }
            }
            finally
            {
                itemList.Dispose();
                
            }
        }
        else
        {
            return Ok();
        }
        return responses;
    }
[HttpPost]
[产品响应类型(StatusCodes.Status201Created)]
[产品响应类型(StatusCodes.Status400BadRequest)]
公共行动结果处理者响应(
[FromBody,ModelBinder(BinderType=typeof(EmptyBodyModelBinder))]MyObject响应
{
var itemList=response.Items.GetEnumerator();
if(itemList.Current.Key!=null)
{
尝试
{
while(itemList.MoveNext())
{
_LogError(“Key:{itemList.Current.Key}-Value:{itemList.Current.Value}”,itemList.Current.Key,itemList.Current.Value);
}
}
最后
{
Dispose();
}
}
其他的
{
返回Ok();
}
回应;
}
毫无疑问,我获得了以下错误消息:System.NullReferenceException:Object reference未设置为对象的实例。
事实上,在这两种情况下,我都必须返回一个Ok响应。。。我的问题是我不知道如何使json主体成为可选的。

为什么不使MyObjectResponse为空?