C# 使用webapi服务的多重调用

C# 使用webapi服务的多重调用,c#,linq,asp.net-mvc-4,azure,asp.net-web-api,C#,Linq,Asp.net Mvc 4,Azure,Asp.net Web Api,我正在使用webapi服务将数据传递到我的移动设备 这可能有两种情况 单个设备多次请求 多个设备请求多次 在这两种情况下,我都无法处理多个请求,我不知道实际的问题是什么,但它一直在给我403响应和500响应 我需要在秒内处理多个请求,,因为我同时处理1000多台设备,并且并排处理,我还需要在几秒钟内响应它们,因为我们不希望我们的设备等待响应超过几秒钟 目前,我使用Azure平台提供Web Api服务,并使用LINQ与MVC4.0合作。如果您需要我的代码,那么我将为您提供代码(我在项目中使用存储库

我正在使用
webapi
服务将数据传递到我的移动设备

这可能有两种情况

  • 单个设备多次请求
  • 多个设备请求多次
  • 在这两种情况下,我都无法处理多个请求,我不知道实际的问题是什么,但它一直在给我
    403响应
    500响应

    我需要在秒内处理多个请求,因为我同时处理1000多台设备,并且并排处理,我还需要在几秒钟内响应它们,因为我们不希望我们的设备等待响应超过几秒钟

    目前,我使用Azure平台提供Web Api服务,并使用LINQ与MVC4.0合作。如果您需要我的代码,那么我将为您提供代码(我在项目中使用存储库模式)

    代码

    控制器:

    [HttpPost]
    public JObject GetData(dynamic data)
    {
       JObject p = new JObject();
    
       try
        {
          MyModelWithObjectInData transactionbatchData = JsonConvert.DeserializeObject<MyModelWithObjectInData>(data.ToString());
          return _batchDataService.batchAllDataResponse(transactionbatchData);//Call Repository 
        }
    }
    
    我使用了下面的代码来跟踪通过该服务发出的所有请求,但我发现其中有错误

    //here i am getting error
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
       //var content = request.Content.ReadAsStringAsync().Result;
       ServiceTypes myObjs = JsonConvert.DeserializeObject<ServiceTypes>(request.Content.ReadAsStringAsync().Result);
    
        bool result = _serviceLogService.InsertLogs(request, myObjs); //Getting Error while inserting data here on multiple request
        return base.SendAsync(request, cancellationToken).ContinueWith((task) =>
          {
            HttpResponseMessage response = task.Result;
            return response;
          });
    }
    
    //这里有个错误
    受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
    {
    //var content=request.content.ReadAsStringAsync().Result;
    ServiceTypes myObjs=JsonConvert.DeserializeObject(request.Content.ReadAsStringAsync().Result);
    bool result=\u serviceLogService.InsertLogs(request,myObjs);//在多个请求中插入数据时出错
    返回base.sendaync(请求,取消令牌).ContinueWith((任务)=>
    {
    HttpResponseMessage response=task.Result;
    返回响应;
    });
    }
    

    在此方面的任何帮助都将不胜感激。

    从api服务提供数据调用的代码片段将非常方便。它们是处理并发查询的几种方法;如果您还没有对其进行探索,那么在这种情况下最好利用该方法。但这是从一个模糊的角度出发的,我需要查看您的代码,以便为您提供一个明确的答案

    附加信息“如果您不熟悉异步编程,或者不了解异步方法如何使用wait关键字在不阻塞调用方线程的情况下执行潜在的长时间运行的工作,您应该阅读中的介绍。”

    希望这些信息能让你走上正轨


    最好。

    我找到了使用
    Async
    方法处理重复服务请求的解决方案

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
      //Logic to Track all the Request
      var response = await base.SendAsync(request, cancellationToken);
      return response;
    }
    
    protectedoverride async Task sendaync(HttpRequestMessage请求,CancellationToken CancellationToken)
    {
    //跟踪所有请求的逻辑
    var response=await base.sendaync(请求、取消令牌);
    返回响应;
    }
    

    我的控制器无法作为请求启动上下文文件,因为它已启动,并且为“并发请求”由于我收到来自设备的多个请求,因此无法锁定我的对象,因此我修改了代码,将所有服务记录在
    SendAsync
    方法中,并等待帮助我等待任务完成。

    感谢您的回答,我已经用代码更新了我的问题,请看一次。我不相信这个问题是因为您的数据抽象方法。我相信您的问题在于CORS(跨源资源共享),因为您返回了403禁止的错误。服务器正在确认请求,但由于权限原因,不允许交换数据。这篇文章提供了一个允许Ok的分步配置,让我检查一下,你能不能建议我,我当前的代码是否能够同时处理多个请求,因为我担心会失败!!我已经更改了您现在可能想要查看的额外代码,如果您能给我一些建议的话。查看您最新的代码片段,您的方法中似乎没有找到等待类型。等待运算符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成
    bool result=wait_serviceLogService.InsertLogs(请求,myObjs)人们似乎知道你的问题是什么,甚至在你把任何代码输入int之前-有+2以上的投票-他们应该提供一些信息。。。另一方面,看起来你们不知道如何用POST调用服务,或者你们只是把自己和名为GetData的POST方法搞混了…@Alexei我担心的是这个问题,而不是UPVOLUES,这只是方法的名称,没有其他我正在使用POST从设备获取数据,并使用相同的函数响应它们。有趣的部分是您如何调用它(可能是Fiddler所说的)-403不太可能是由您的存储库引起的,所以这部分不是真正有趣的(而且你可能已经尝试用存根替换它以进行实验…)如果你能给我一些建议的话,我已经更改了你现在可能想要查看的额外代码。我完全不知道你的问题是什么…一些提示:为你自己澄清如果403的所有或只是一些请求失败,请确保你的服务在本地运行良好(包括发送期望的请求量)。找出什么是“获取错误”——即查看调用堆栈。如果使用家庭构建,请考虑使用现有的日志库。祝您好运。
    
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
      //Logic to Track all the Request
      var response = await base.SendAsync(request, cancellationToken);
      return response;
    }