【问题标题】:Multiple Requests in Web Api gets an exception when calling WCF serviceWeb Api 中的多个请求在调用 WCF 服务时出现异常
【发布时间】:2023-04-01 12:45:01
【问题描述】:

我工作的公司最近实施了 .Net Web Api 2,我负责。我遇到了一个我无法解决的问题。

有一个使用 WCF 服务的 Post 方法。这个 WCF 在大约 30 秒内执行并列举了一些我作为请求传递的列表。所以我在调用 Web Api 方法时读到了并发性并感到害怕。但是,我确实将 IHttpActionResult 实现为所有 ApiController 的结果类型。在那个实现中,我已经按照每个人的建议返回一个任务。尽管如此,异常仍然发生。这个异常是通用的,对我来说显然是两个线程之间的并发。下面我给大家看一段代码。

更新

通用意味着我总是遇到不同的异常。因为并发可能无处不在。

public IHttpActionResult Post([FromBody]Cotacao cotacao)
{
    return new CotacaoResult(cotacao, Request);
}

public abstract class ActionResult<T> : IHttpActionResult where T : class
{
    protected T Item { get; private set; }
    protected HttpRequestMessage Request { get; private set; }

    protected ActionResult(HttpRequestMessage request)
    {
        Item = null;
        Request = request;            
    }

    protected ActionResult(T item, HttpRequestMessage request)
    {
        Item = item;
        Request = request;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(Do());
    }

    private HttpResponseMessage Do()
    {
        try
        {
            return Execute();
        }
        catch (Exception)
        {
             return new HttpResponseMessage(HttpStatusCode.InternalServerError) { RequestMessage = Request };                
        }
    }

    protected abstract HttpResponseMessage Execute();
}

public class CotacaoResult : ActionResult<Cotacao>
{
    public CotacaoResult(Cotacao item, HttpRequestMessage request) : base(item, request) { }        

    protected override HttpResponseMessage Execute()
    {            
        using (var gateway = new GatewayClient()) //WCF Service
        {
            var result = gateway.CreateQuote(Item.ToQuote());

            //Something else
        }
    }
}

我的问题是:当 Web Api 使用 WCF 并且同时有很多请求时,我该如何处理 Web Api 中的并发?

【问题讨论】:

  • “异常是通用的”?这意味着什么?错误是什么?
  • @DavidG 当我说通用时,我的意思是抛出了不同类型的异常。因为并发发生在代码的不同位置。
  • 举个例子怎么样? Web Api 被设计为并发调用,它本质上只是一个 Web 服务。

标签: c# wcf c#-4.0 asp.net-web-api asp.net-web-api2


【解决方案1】:

我已经解决了。 wcf 层有一个静态类,它与其他线程并发。我只是让它成为非静态的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多