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;
}