Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Flurl和HttpClient,REST API没有响应_C#_Json_Flurl - Fatal编程技术网

C#Flurl和HttpClient,REST API没有响应

C#Flurl和HttpClient,REST API没有响应,c#,json,flurl,C#,Json,Flurl,我的代码在从API获取响应时遇到问题,请求没有超时,也没有给我任何响应。我在自己的api中创建了一个api端点,返回json字符串,然后用“Firefox Poster”手动发布json数据,效果很好。有了这一点,我相信问题出在我的代码中的某个地方 我得到了一个C#WebAPI,我正在开发它,以便与一个有角度的前端一起使用(这很有效,只是为了历史)。调用API时,我创建对象“EnrollmentRequestDto” 公共类注册请求到 { /// ///请求的上下文信息。包含收货地址、语言代码

我的代码在从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);
        }
    }