相关疑难解决方法(0)

如何配置HttpClient在收到301 HTTP状态代码时不自动重定向?

考虑重定向的ASP.NET Web API服务

public class ThisController : ApiController
{
    /* more methods */

    public override HttpResponseMessage Post()
    {
        var result = new HttpResponseMessage(HttpStatusCode.MovedPermanently);
        // Post requests should be made to "ThatController" instead.
        string uri = Url.Route("That", null);
        result.Headers.Location = new Uri(uri, UriKind.Relative);
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

试图验证POST数据到"api/this"会将你重定向到"api/that",我有以下测试方法:

[TestMethod]
public void PostRedirects()
{
    using (var client = CreateHttpClient("application/json"))
    {
        var content = CreateContent(expected, "application/json");
        using (var responseMessage = client.PostAsync("api/this", content).Result)
        {
            Assert.AreEqual(HttpStatusCode.MovedPermanently, responseMessage.StatusCode);
            Assert.AreEqual(new Uri("https://api.example.com/api/that"), responseMessage.Headers.Location);
        }
    }
}

protected HttpClient …
Run Code Online (Sandbox Code Playgroud)

c#-4.0 asp.net-web-api dotnet-httpclient

47
推荐指数
1
解决办法
2万
查看次数

System.Net.Http.HttpRequestException将内容复制到流时出错

我在.Net 4.5.2框架中使用HttpClient类.我正在对第三方Web服务进行PostAsync.这篇文章80%的时间都在工作,20%的时间我们的回复被缩短了.在这种情况下,我们得到以下异常:

System.Net.Http.HttpRequestException:将内容复制到流时出错.---> System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭现有连接.---> System.Net.Sockets.SocketException:远程主机在System.Net.Sockets.NetworkStream.BeginRead(Byte []缓冲区,Int32偏移量,Int32大小,AsyncCallback回调,对象状态)强制关闭现有连接---内部异常堆栈跟踪的结束---在System.Net.FixedSizeReader.StartReading()的System.Net.Sockets.NetworkStream.BeginRead(Byte []缓冲区,Int32偏移量,Int32大小,AsyncCallback回调,对象状态)在System.Net.Security._SslStream.StartFrameHeader(字节[]缓冲液,的Int32偏移的Int32计数,AsyncProtocolRequest asyncRequest)在System.Net.Security._SslStream.StartReading(字节[]缓冲液,的Int32偏移的Int32计数,

随后的相同请求成功.这不是我们可以重新设置的请求,因为已经放置了业务.所以它让我们处于一种尴尬的境地.

这是我的代码:

using (var httpClient = new HttpClient())
{
    httpClient.DefaultRequestHeaders.Authorization = authorizationHeader;
    HttpContent httpContent = new StringContent(someXml);

    //Exception occurs on next line...
    var response = await httpClient.PostAsync("https://thirdpartyendpoint", httpContent);
    var responseXml = await response.Content.ReadAsStringAsync();  
    //convert to Dto              
}
Run Code Online (Sandbox Code Playgroud)

第三方服务成功地将记录保存到他们的数据库中,并且在他们的结尾没有看到任何明显的例外.他们确实注意到,写入数据库的失败请求通常需要比成功请求更长的时间(大约18-30秒).

谢谢您的帮助

.net c# asp.net asp.net-web-api

16
推荐指数
2
解决办法
2万
查看次数

Web Api请求在将内容复制到流时会出现"错误".

我正在尝试实现此代码示例,但得到HttpRequestException- " 将内容复制到流时出错 ".ReadAsStringAsync()调用方法时 内部异常是" 无法访问已处置的对象".我正在使用Fiddler来提出请求.我不明白.有人可以解释为什么我得到这个例外并提供解决方案吗?

Web Api方法:

public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
    try
    {
        var jsonString = await request.Content.ReadAsStringAsync();
    }
    catch (Exception ex)
    {                
        throw;
    }
    return new HttpResponseMessage(HttpStatusCode.Created);
}
Run Code Online (Sandbox Code Playgroud)

提琴手(POST):

User-Agent: Fiddler
Host: localhost:23567
Content-Length: 18
Content-Type: application/json; charset=utf-8
Body{"Test":1}
Run Code Online (Sandbox Code Playgroud)

编辑:

我有一个线索,但需要验证.在Web Api控制器上,我有一个ActionFilterAttribute并且在它的OnActionExecuting覆盖中,有这一行:

public override async void OnActionExecuting(HttpActionContext actionContext)
{
    // omitted code
    actionContext.Request.Content.ReadAsStreamAsync();
}
Run Code Online (Sandbox Code Playgroud)

可能是因为内容在这里被读取,它再也无法使用?如果是这样,我怎么能在方法中使它?此处的内容是否与HttpRequestMessage相同? 可能包含答案.

c# asp.net-web-api

10
推荐指数
2
解决办法
2万
查看次数

在FlurlClient中禁用自动重定向

我正在使用FlurlHttp,并且想对某些API调用禁用AllowAutoRedirect。我知道如何使System.Net.Http.HttpClient不遵循302重定向?

WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
HttpClient httpClient = new HttpClient(webRequestHandler);
// Send a request using GetAsync or PostAsync
Task<HttpResponseMessage> response = httpClient.GetAsync("http://www.google.com")
Run Code Online (Sandbox Code Playgroud)

但是对于Flurl,我只找到了与C#Flurl中所述类似的方法 -将WebRequestHandler添加到FlurlClient(我尚未编译下面的代码,因此可能会有一些错误)

public class HttpClientFactoryWithWebRequestHandler : DefaultHttpClientFactory
{
    private readonly WebRequestHandler _webRequestHandler;

    public HttpClientFactoryWithWebRequestHandler (WebRequestHandler webRequestHandler ) 
    {
        _webRequestHandler = webRequestHandler ;
    }

    public override HttpMessageHandler CreateMessageHandler()
    {
        var handler =_webRequestHandler ;
//Or    var handler = new WebRequestHandler(_webRequestHandler );
        return handler;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我可以为新的FlurlClient传递设置:

WebRequestHandler webRequestHandler = new …
Run Code Online (Sandbox Code Playgroud)

redirect dotnet-httpclient flurl asp.net-core-webapi

5
推荐指数
2
解决办法
698
查看次数