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# 如何在没有响应的情况下返回null?_C#_Asp.net Core_Nswag - Fatal编程技术网

C# 如何在没有响应的情况下返回null?

C# 如何在没有响应的情况下返回null?,c#,asp.net-core,nswag,C#,Asp.net Core,Nswag,当我找不到任何数据时,控制器返回204 [Route("api/[controller]")] [ApiController] public class SeasonsController : Controller { private readonly IMediator _mediator; private readonly IMapper _mapper; public SeasonsController(IMediator mediator,

当我找不到任何数据时,控制器返回204

[Route("api/[controller]")]
[ApiController]
public class SeasonsController : Controller
{
    private readonly IMediator _mediator;
    private readonly IMapper _mapper;

    public SeasonsController(IMediator mediator, IMapper mapper)
    {
        _mediator = mediator;
        _mapper = mapper;
    }

    [HttpGet, Route("by-betContextId/{betContextId:int}")]
    [SwaggerResponse(HttpStatusCode.OK, typeof(SeasonEntity))]
    public async Task<IActionResult> TryGetByBetContextId(int betContextId)
    {
        SeasonEntity entity = await _mediator.Send(new TryGetSeasonByBetContextId(betContextId));
        //the entity above can be null
        return Ok(entity);
    }
}
[路由(“api/[控制器]”)]
[ApiController]
公共类季节控制器:控制器
{
专用只读IMediator\u中介;
专用只读IMapper\u映射器;
公共季节控制器(IMediator mediator、IMapper映射器)
{
_调解人=调解人;
_映射器=映射器;
}
[HttpGet,Route(“by betContextId/{betContextId:int}”)]
[SwaggerResponse(HttpStatusCode.OK,typeof(实体))]
公共异步任务TryGetByBetContextId(int betContextId)
{
SeasonEntity=wait_mediator.Send(新的TryGetSeasonByBetContextId(betContextId));
//上面的实体可以为空
返回Ok(实体);
}
}
这是nswag自动生成的客户端

 /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param>
    /// <exception cref="SportradarFaultException">A server side error occurred.</exception>
    public async System.Threading.Tasks.Task<SeasonEntity> TryGetByBetContextIdAsync(int betContextId, System.Threading.CancellationToken cancellationToken)
    {
        if (betContextId == null)
            throw new System.ArgumentNullException("betContextId");

        var urlBuilder_ = new System.Text.StringBuilder();
        urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Seasons/by-betContextId/{betContextId}");
        urlBuilder_.Replace("{betContextId}", System.Uri.EscapeDataString(ConvertToString(betContextId, System.Globalization.CultureInfo.InvariantCulture)));

        var client_ = _httpClient;
        try
        {
            using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false))
            {
                request_.Method = new System.Net.Http.HttpMethod("GET");
                request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));

                PrepareRequest(client_, request_, urlBuilder_);
                var url_ = urlBuilder_.ToString();
                request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
                PrepareRequest(client_, request_, url_);

                var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
                try
                {
                    var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
                    if (response_.Content != null && response_.Content.Headers != null)
                    {
                        foreach (var item_ in response_.Content.Headers)
                            headers_[item_.Key] = item_.Value;
                    }

                    ProcessResponse(client_, response_);

                    var status_ = (int)response_.StatusCode;
                    if (status_ == 200)
                    {
                        var objectResponse_ = await ReadObjectResponseAsync<SeasonEntity>(response_, headers_).ConfigureAwait(false);
                        if (objectResponse_.Object == null)
                        {
                            throw new SportradarFaultException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
                        }
                        return objectResponse_.Object;
                    }
                    else
                    {
                        var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); 
                        throw new SportradarFaultException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
                    }
                }
                finally
                {
                    if (response_ != null)
                        response_.Dispose();
                }
            }
        }
        finally
        {
        }
    }
///可由其他对象或线程用于接收取消通知的取消令牌。
///发生服务器端错误。
公共异步System.Threading.Tasks.Task TryGetByBetContextIdAsync(int betContextId,System.Threading.CancellationToken CancellationToken)
{
if(betContextId==null)
抛出新的System.ArgumentNullException(“betContextId”);
var urlBuilder_u2;=new System.Text.StringBuilder();
urlBuilder_u2;.Append(BaseUrl!=null?BaseUrl.TrimEnd('/'):“”)。Append(“/api/seasures/by betContextId/{betContextId}”);
urlBuilder_u2;.Replace(“{betContextId}”,System.Uri.EscapeDataString(ConvertToString(betContextId,System.Globalization.CultureInfo.InvariantCulture));
var客户端=_httpClient;
尝试
{
使用(var request_u=等待CreateHttpRequestMessageAsync(cancellationToken)。配置等待(false))
{
request.Method=new System.Net.Http.HttpMethod(“GET”);
request.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse(“应用程序/json”);
准备请求(客户请求、请求、urlBuilder);
var url=urlBuilder\uu.ToString();
request.RequestUri=new System.Uri(url,System.UriKind.RelativeOrAbsolute);
准备请求(客户端、请求、url);
var response_u3;=等待客户端_3;。发送异步(请求_3;,System.Net.Http.HttpCompletionOption.ResponseHeadersRead,cancellationToken)。配置等待(false);
尝试
{
var headers\uq=System.Linq.Enumerable.ToDictionary(response\uq.headers,h\u=>h\ukey,h\u=>h\uq.Value);
if(response.Content!=null&&response.Content.Headers!=null)
{
foreach(响应中的变量项内容标题)
标题\项\项\项键】=项\项值;
}
ProcessResponse(客户端,响应);
变量状态=(int)响应状态代码;
如果(状态=200)
{
var objectResponse_u2;=等待ReadObjectResponseAsync(响应_2;、头_2;)。配置等待(false);
if(objectResponse.Object==null)
{
抛出新的SportradarFaultException(“响应为null,这不是预期的。”,状态,对象响应,文本,标题,null);
}
返回objectResponse.Object;
}
其他的
{
var responseData_U7;=response_U7;.Content==null?null:await response_U7;.Content.ReadAsStringAsync().ConfigureAwait(false);
抛出新的SportradarFaultException(“响应的HTTP状态代码不是预期的(“+status_+”)”),状态为,响应数据为,标头为,null);
}
}
最后
{
如果(响应!=null)
响应.Dispose();
}
}
}
最后
{
}
}
当我返回Ok()而不是Ok(实体)时,我接受“响应为null,这是不期望的。”

当我从RESTAPI客户机进行调用时,我发现了一个错误


当数据为空时,如何让它返回200?

这个问题与NSwag如何生成REST客户端API有关

选项1:不要使用自动生成的NSwag客户端代码,该代码显然需要可分析的
实体

var objectResponse_ = await ReadObjectResponseAsync<SeasonEntity>(response_, headers_)
    .ConfigureAwait(false);
if (objectResponse_.Object == null)
{
    throw new SportradarFaultException("Response was null which was not expected.", status_, 
        objectResponse_.Text, headers_, null);
}

选项3比选项2更有意义。当找不到匹配项时,为什么要返回
200
响应?

我更改了nswag.json的配置

"defaultResponseReferenceTypeNullHandling": "NotNull",

并将控制器更改为

[Route("api/[controller]")]
[ApiController]
public class SeasonsController : Controller
{
    private readonly IMediator _mediator;
    private readonly IMapper _mapper;

    public SeasonsController(IMediator mediator, IMapper mapper)
    {
        _mediator = mediator;
        _mapper = mapper;
    }

    [HttpGet, Route("TryGetByBetContextId")]
    [ProducesResponseType(typeof(SeasonEntity), StatusCodes.Status200OK)]
    public async Task<IActionResult> TryGetByBetContextId(int betContextId)
    {
        SeasonEntity entity = await _mediator.Send(new TryGetSeasonByBetContextId(betContextId));

        if (entity == null)
            return Ok();

        return Ok(entity);
    }
}
[路由(“api/[控制器]”)]
[ApiController]
公共类季节控制器:控制器
{
专用只读IMediator\u中介;
专用只读IMapper\u映射器;
公共季节控制器(IMediator mediator、IMapper映射器)
{
_调解人=调解人;
_映射器=映射器;
}
[HttpGet,Route(“TryGetByBetContextId”)]
[产品响应类型(typeof(季节实体),StatusCodes.Status200OK)]
公共异步任务TryGetByBetContextId(int betContextId)
{
SeasonEntity=wait_mediator.Send(新的TryGetSeasonByBetContextId(betContextId));
if(实体==null)
返回Ok();
返回Ok(实体);
}
}

尝试用属性装饰控制器的方法

[return: CanBeNull]

什么是“nswag”,他们如何不知道成功的restful HTTP响应的代码范围为[200299]?你能试试返回状态码(200)
并查看是否成功?这是否回答了您的问题@咆哮所以如果您返回
returnitem==null,看起来是这样的?Ok():Ok(项目)应该可以吗?是的,我相信可以。顺便说一下:您的控制器可以从ControllerBase继承。如果您查看
Microsoft.AspNetC的源代码
[Route("api/[controller]")]
[ApiController]
public class SeasonsController : Controller
{
    private readonly IMediator _mediator;
    private readonly IMapper _mapper;

    public SeasonsController(IMediator mediator, IMapper mapper)
    {
        _mediator = mediator;
        _mapper = mapper;
    }

    [HttpGet, Route("TryGetByBetContextId")]
    [ProducesResponseType(typeof(SeasonEntity), StatusCodes.Status200OK)]
    public async Task<IActionResult> TryGetByBetContextId(int betContextId)
    {
        SeasonEntity entity = await _mediator.Send(new TryGetSeasonByBetContextId(betContextId));

        if (entity == null)
            return Ok();

        return Ok(entity);
    }
}
[return: CanBeNull]