首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在HttpContent应用程序中使用ASP.NET处理并发(状态409)错误?

如何在HttpContent应用程序中使用ASP.NET处理并发(状态409)错误?
EN

Stack Overflow用户
提问于 2021-01-19 14:51:43
回答 1查看 622关注 0票数 0

我正在开发一个Core3.1WebAPI和一个使用它的MVC应用程序。在MVC应用程序中,我设置了包含一个UserRepo方法的Update

代码语言:javascript
复制
public async Task<User> Update(User user)
{
    HttpClient client = _clientFactory.CreateClient("namedClient");

    HttpResponseMessage response = await client.PutAsync($"api/Users/{user.Id}", ContentEncoder.Encode(user));
    try
    {
        response.EnsureSuccessStatusCode();
    }
    catch (Exception ex)
    {
        if ((int)response.StatusCode == StatusCodes.Status409Conflict)
        {
            throw;
        }
    }

    return await response.Content.ReadFromJsonAsync<User>();
}

将回购注入到服务中,将服务注入控制器(我希望在这里处理错误)。

Update方法是不完整的,因为我试图弄清楚如何处理409错误,如果行版本值过时,则从API返回该错误。当调用response.EnsureSuccessStatusCode();时,如果它不是成功代码,则会引发异常。我想我可以让它一直泡到前端,然后在控制器操作中处理它,但是异常对象没有包含足够具体的东西来识别它是409错误:

因此,如果出现气泡到控制器操作,我最好尝试从message中解析状态代码,这似乎是个坏主意。

我可以找到从Web中返回409段代码的人的例子,但当逻辑被分离成不同的类而不是在一个动作中时,他们将如何在MVC应用程序中处理这些代码。

我怎么能处理这事?我是否创建一个自定义异常并抛出该异常?也许可以在ex.Data.Add()异常中添加额外的数据并在操作中读取它?那会是个坏主意吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-21 20:22:11

感谢“彼得·克拉拉”、“克雷格·H”和“菲利佩”的建议,这是我决定的解决方案。

方法,该方法调用API:

代码语言:javascript
复制
public async Task<User> Update(User user)
{
    HttpClient client = _clientFactory.CreateClient("namedClient");
    HttpResponseMessage response = await client.PutAsync($"api/Users/{user.Id}", ContentEncoder.Encode(user));
    await HttpResponseValidator.ValidateStatusCode(response);

    return await response.Content.ReadFromJsonAsync<User>();
}

我可以重用一个静态方法,它将在并发错误期间产生异常:

代码语言:javascript
复制
public static class HttpResponseValidator
{
    public static async Task ValidateStatusCode(HttpResponseMessage response)
    {
        if ((int)response.StatusCode < 200 || (int)response.StatusCode > 299)
        {
            string errorResponse = await response.Content.ReadAsStringAsync();
            if (response.StatusCode == HttpStatusCode.Conflict)
            {
                DBConcurrencyException ex = new DBConcurrencyException(errorResponse);
                throw ex;
            }
        }
    }
}

异常会一直弹出,返回到调用API方法的操作。我在操作中捕获它,并在记录错误后处理它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65793934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档