C#Flurl和HttpClient,REST API没有响应
我的代码在从API获取响应时遇到问题,请求没有超时,也没有给我任何响应。我在自己的api中创建了一个api端点,返回json字符串,然后用“Firefox Poster”手动发布json数据,效果很好。有了这一点,我相信问题出在我的代码中的某个地方 我得到了一个C#WebAPI,我正在开发它,以便与一个有角度的前端一起使用(这很有效,只是为了历史)。调用API时,我创建对象“EnrollmentRequestDto”C#Flurl和HttpClient,REST API没有响应,c#,json,flurl,C#,Json,Flurl,我的代码在从API获取响应时遇到问题,请求没有超时,也没有给我任何响应。我在自己的api中创建了一个api端点,返回json字符串,然后用“Firefox Poster”手动发布json数据,效果很好。有了这一点,我相信问题出在我的代码中的某个地方 我得到了一个C#WebAPI,我正在开发它,以便与一个有角度的前端一起使用(这很有效,只是为了历史)。调用API时,我创建对象“EnrollmentRequestDto” 公共类注册请求到 { /// ///请求的上下文信息。包含收货地址、语言代码
公共类注册请求到
{
///
///请求的上下文信息。包含收货地址、语言代码和时区。
///
[JsonProperty(“requestContext”)]
public RequestContextDto RequestContext{get;set;}
///
///DEP在设置DEP访问权限时向分销商提供的唯一ID。如果分销商OBO为分销商发布,则该ID为分销商的DEP ID;如果分销商为自己发布,则该ID为分销商自己的depResellerId。
///
[JsonProperty(“depResellerId”)]
公共字符串DepResellerId{get;set;}
///
///经销商提供的唯一交易ID
///
[JsonProperty(“transactionId”)]
公共字符串TransactionId{get;set;}
///
///交易中的订单列表(每笔交易限额1000)
///
[JsonProperty(“订单”)]
公共列表顺序{get;set;}
}
创建此对象后,我将发送到我的类RequestHandler和方法BulkEnrollRequest,atm使用HttpClient扩展Flurl编写,可在此处找到:
public IResponse BulkEnrollRequest(注册请求到注册请求)
{
尝试
{
var result=_bulkEnrollUrl.PostJsonAsync(enrollmentRequest.ReceiveJson();
result.Wait();
返回结果。结果;
}
捕获(FlurlHttpTimeoutException)
{
抛出新的AppleTimeOutException();
}
捕获(FlurlHttpEx异常)
{
返回_errorHandler.DeserializeFlurException(ex);
}
}
我也尝试过这样做,以确保Flurl中不会发生任何事情(这只是为了调试到我想要得到响应的程度):
公共异步任务BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
var json=JsonConvert.SerializeObject(enrollmentRequest);
var httpClient=新的httpClient();
httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=等待httpClient.PostAsync(_-URL,新的StringContent(json,Encoding.UTF8,“application/json”);
返回新的SuccessResponse();
}
代码冻结在等待点,什么都没有发生。我尝试在请求之后放置断点,这样它就不会离开这个方法
现在有一个有趣的部分:当我在处理ErrorHandler时,它确实起了作用,并且在某个时候API停止了响应。Wireshark显示正在发出请求。。。所以我被卡住了
感谢您的帮助
编辑
现在可以了!我实现了异步,从API控制器一直到RequestHandler,然后等待每次调用。供参考:
public async Task<IResponse> BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
try
{
var result = await _bulkEnrollUrl.PostJsonAsync(enrollmentRequest).ReceiveJson<SuccessResponse>();
return result;
}
catch (FlurlHttpTimeoutException)
{
throw new AppleTimeOutException();
}
catch (FlurlHttpException ex)
{
return _errorHandler.DeserializeFlurlException(ex);
}
}
public async Task<IResponse> BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
try
{
var result = await _bulkEnrollUrl.PostJsonAsync(enrollmentRequest).ReceiveJson<SuccessResponse>();
return result;
}
catch (FlurlHttpTimeoutException)
{
throw new AppleTimeOutException();
}
catch (FlurlHttpException ex)
{
return _errorHandler.DeserializeFlurlException(ex);
}
}
公共异步任务BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
尝试
{
var result=await_bulkEnrollUrl.PostJsonAsync(enrollmentRequest.ReceiveJson();
返回结果;
}
捕获(FlurlHttpTimeoutException)
{
抛出新的AppleTimeOutException();
}
捕获(FlurlHttpEx异常)
{
返回_errorHandler.DeserializeFlurException(ex);
}
}
试试这段代码
安装软件包Microsoft.AspNet.WebApi.Client
使用(var-client=new-HttpClient())
{
client.BaseAddress=新Uri(“http://localhost:9000/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=wait client.postsjsonasync(“api/products”,enrollmentRequest);
if(响应。IsSuccessStatusCode)
{
var result=await response.Content.ReadAsAsync();
}
}
现在已修复此问题。我相信Wireshark流量看起来如此奇怪的原因是因为代码中出现了死锁,而超时是在我这边,这意味着我永远无法找到信息。为了解决这个问题,我在从控制器到RequestHandler类的所有方法上实现了异步。供参考:
public async Task<IResponse> BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
try
{
var result = await _bulkEnrollUrl.PostJsonAsync(enrollmentRequest).ReceiveJson<SuccessResponse>();
return result;
}
catch (FlurlHttpTimeoutException)
{
throw new AppleTimeOutException();
}
catch (FlurlHttpException ex)
{
return _errorHandler.DeserializeFlurlException(ex);
}
}
public async Task<IResponse> BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
try
{
var result = await _bulkEnrollUrl.PostJsonAsync(enrollmentRequest).ReceiveJson<SuccessResponse>();
return result;
}
catch (FlurlHttpTimeoutException)
{
throw new AppleTimeOutException();
}
catch (FlurlHttpException ex)
{
return _errorHandler.DeserializeFlurlException(ex);
}
}
公共异步任务BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
尝试
{
var result=await_bulkEnrollUrl.PostJsonAsync(enrollmentRequest.ReceiveJson();
返回结果;
}
捕获(FlurlHttpTimeoutException)
{
抛出新的AppleTimeOutException();
}
捕获(FlurlHttpEx异常)
{
返回_errorHandler.DeserializeFlurException(ex);
}
}
它仍然在等待时冻结。这就像我的代码无法找到答案一样:)下载fiddler并将您的http请求与发送的“Firefox海报”进行比较谢谢您的评论,我就是这么做的,我找不到任何奇怪的请求。然而,我确实在Fiddler中发现,我确实从API接收到了一个响应,这正是我在代码中识别的“SuccessResponse”。我也做了一个Wireshark追踪,我想交通看起来有点奇怪。没有明显的RST或FIN ACK告诉我交易结束了…很高兴看到您没有放弃Flurl;)对我来说,这里的关键是陷阱
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:9000/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.PostAsJsonAsync("api/products", enrollmentRequest);
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadAsAsync<T>();
}
}
public async Task<IResponse> BulkEnrollRequest(EnrollmentRequestDto enrollmentRequest)
{
try
{
var result = await _bulkEnrollUrl.PostJsonAsync(enrollmentRequest).ReceiveJson<SuccessResponse>();
return result;
}
catch (FlurlHttpTimeoutException)
{
throw new AppleTimeOutException();
}
catch (FlurlHttpException ex)
{
return _errorHandler.DeserializeFlurlException(ex);
}
}