我正在使用许多默认模板功能来开发一个相当简单的Blazor应用程序,并且我无法弄清楚如何从服务器返回非正常返回值的ActionResult。
在服务器端,我对默认控制器模板进行了一些修改,使其看起来像这样:
public async Task<ActionResult<MyData>> GetSession(int id)
{
var myData= await FetchMyData(id);
if (myData== null)
{
return NotFound();
}
return myData;
}
检查空值是否在原始模板中-似乎是个好主意,所以我保留了它。在客户端,我的代码如下所示:
public async Task<MyData> GetMyData(int id)
{
return await Http.GetJsonAsync<MyData>("/api/MyData/" + id);
}
一切正常,除了客户端代码无法处理服务器端返回“ NotFound()”结果的情况。这不是表演的制胜法宝,但令我发疯,因为我不知道该怎么做。
似乎客户端上的GetJsonAsync()调用正在默默地从ActionResult包装器中包装返回值(我想是吗?)。这是否意味着如果我想处理NotFound条件,我应该使用其他的httpclient函数,并且可能自己反序列化Value对象?如果是这样,那么有人愿意做一个榜样吗?
或者我错过了什么,还有更简单的方法吗?
[在服务器端检查条件只是向客户端发送警告,最终导致未处理的异常,这似乎很愚蠢。
我尝试了Henk Holterman的建议,即只添加一个try / catch,结果发现异常包含了我想要的信息,即服务器返回的状态。所以我应该做的是:
public async Task<MyData> GetMyData(int id)
{
try
{
return await Http.GetJsonAsync<MyData>("/api/MyData/" + id);
}
catch (System.Net.Http.HttpRequestException e)
{
.... process the exception
}
}
结果是HttpRequestException具有HResult,这就是我想要的。
感谢Henk。