标签: webclient

ASP.NET控制器:在异步操作仍处于挂起状态时完成的异步模块或处理程序

我有一个非常简单的ASP.NET MVC 4控制器:

public class HomeController : Controller
{
    private const string MY_URL = "http://smthing";
    private readonly Task<string> task;

    public HomeController() { task = DownloadAsync(); }

    public ActionResult Index() { return View(); }

    private async Task<string> DownloadAsync()
    {
        using (WebClient myWebClient = new WebClient())
            return await myWebClient.DownloadStringTaskAsync(MY_URL)
                                    .ConfigureAwait(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我启动项目时,我看到了我的视图,它看起来很好,但是当我更新页面时,我收到以下错误:

[InvalidOperationException:在异步操作仍处于挂起状态时完成异步模块或处理程序.

为什么会这样?我做了几个测试:

  1. 如果我们task = DownloadAsync();从构造函数中删除并将其放入Index方法中它将正常工作而没有错误.
  2. 如果我们使用另一个DownloadAsync()身体return await Task.Factory.StartNew(() => { Thread.Sleep(3000); return "Give me an error"; });它将正常工作.

为什么不可能WebClient.DownloadStringTaskAsync在控制器的构造函数中使用该方法?

.net c# webclient async-await asp.net-mvc-4

43
推荐指数
3
解决办法
5万
查看次数

通过WebClient.DownloadData自动解压缩gzip响应

我希望自动解压缩GZiped的响应.我使用以下代码段:

mywebclient.Headers[HttpRequestHeader.AcceptEncoding] = "gzip";
mywebclient.Encoding = Encoding.UTF8;

try
{
    var resp = mywebclient.DownloadData(someUrl);
}
Run Code Online (Sandbox Code Playgroud)

我已经检查了HttpRequestHeader enum,没有选择通过这个来做到这一点Headers

如何自动解压缩resp?或者我应该使用另一种功能而不是mywebclient.DownloadData

.net gzip webclient

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

服务器提交了协议违规.Section = ResponseHeader Detail = CR必须后跟LF,在WinForms中?

我试图使用WebClient/HttpWebRequest从服务器下载一些数据.我使用以下代码来执行此操作:

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("admin", "password");
Stream datastream = client.OpenRead("http://routerlogin.com/cgi-bin/CF_logs.html");
StreamReader reader = new StreamReader(datastream);
Run Code Online (Sandbox Code Playgroud)

服务器是我的页面在路由器的配置中.它可以在浏览器中正常工作,但是当使用我的代码下载时,它会抛出一条WebException消息

服务器提交了协议违规.Section = ResponseHeader Detail = CR必须后跟LF,在WinForms?中.

我找到了一个解决方案,如果他们使用ASP.net,可以使用,将以下内容添加到web.config:

<configuration> 
    <system.net> 
        <settings> 
            <httpWebRequest useUnsafeHeaderParsing="true" /> 
        </settings> 
    </system.net> 
</configuration>
Run Code Online (Sandbox Code Playgroud)

但是,我正在制作一个WinForms应用程序,所以这对我不起作用.有什么替代方法可以解决这个问题?

c# webclient httpwebrequest system.net.webexception winforms

40
推荐指数
1
解决办法
5万
查看次数

DataBufferLimitException:超出缓冲 webflux 错误的最大字节数限制

在发送文件时,我收到一个字节数组。我总是遇到 webflux 接收数组的问题。抛出的错误如下:

org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
    at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:101)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException
Run Code Online (Sandbox Code Playgroud)

你现在如何在 webflux 中解决这个问题?

java spring webclient spring-webflux

39
推荐指数
7
解决办法
4万
查看次数

如何使用Fiddler调试来自任何应用程序的流量(例如C#/ WPF应用程序)

我想在这里调试来自另一个问题的 HTTP请求的错误.所以我读了一下Fiddler,想用它来调试我的问题.但我似乎无法通过我的WPF应用程序获得通过Fiddler的流量.我相信我需要配置一个代理.我使用WebClient作为基本示例,但我想我稍后会需要WebRequest.但是现在,通过一个简单的WebClient,我怎样才能让它通过Fiddler(我相信我必须将代理设置为localhost:8888)?

更新:

我不知道我是否做对了,但我试过了

var wc = new WebClient();
WebProxy proxy = new WebProxy();
proxy.Address = new Uri("http://localhost:8888");
wc.Proxy = proxy;
Run Code Online (Sandbox Code Playgroud)

但失败了 - 我在Fiddler看不到任何交通

我试过了 ...

var wc = new WebClient();
WebProxy proxy = new WebProxy("127.0.0.1", 8888);
wc.Proxy = proxy;
Run Code Online (Sandbox Code Playgroud)

依然没有

c# wpf webclient httpwebrequest fiddler

38
推荐指数
3
解决办法
6万
查看次数

解压缩来自WebClient的gzip响应

有没有一种快速方法来解压缩使用WebClient.DownloadString()方法下载的gzip响应?您对如何使用WebClient处理gzip响应有任何建议吗?

.net c# webclient

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

控制台应用在异步呼叫完成之前终止

我目前正在编写一个C#控制台应用程序,它会生成许多指向网站上不同图像的URL,然后使用下载作为字节流WebClient.DownloadDataAsync().

我的问题是,一旦进行了第一次异步调用,控制台应用程序会认为程序已完成并在异步调用返回之前终止.通过使用Console.Read()我可以强制控制台保持打开,但这似乎不是很好的设计.此外,如果用户在进程期间点击进入(当控制台正在等待输入时),程序将终止.

在等待异步调用返回时,是否有更好的方法可以阻止控制台关闭?

编辑:调用是异步的,因为我在下载过程中通过控制台向用户提供状态指示器.

c# asynchronous webclient windows-console

37
推荐指数
3
解决办法
1万
查看次数

是否可以将身份验证从Webbrowser转移到WebRequest

我正在使用webbrowser控件登录任何网站.然后我想使用WebRequest(或WebClient)下载一些子页面html.此链接必须要求身份验证.

如何将Webbrowser身份验证信息传输到Webrequest或Webclient?

c# webclient httpwebrequest webbrowser-control

36
推荐指数
4
解决办法
4万
查看次数

有没有办法用WebClient做PUT?

使用.NET 4.0中的WebClient类,有没有办法进行PUT?

我知道你可以使用DownloadString()和带有UploadString()的POST进行GET,但是有一个方法或属性可以让你做PUT吗?

谢谢.

c# webclient .net-4.0

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

如何指定用于WebClient类的SSL协议

我有一个应用程序使用HTTPS POST将数据发送到服务器.我使用System.Net.WebClient对象来执行此操作.这是一个发送一些数据的函数:

    private byte[] PostNameValuePairs(string uri, NameValueCollection pairs)
    {
        byte[] response;
        String responsestring = "";
        using (WebClient client = new WebClient())
        {
            client.Headers = GetAuthenticationHeader();

            string DataSent = GetNameValueCollectionValuesString(pairs);

            try
            {
                response = client.UploadValues(uri, pairs);
                responsestring = Encoding.ASCII.GetString(response);
            }
            catch (Exception e)
            {
                responsestring = "CONNECTION ERROR: " + e.Message;
                return Encoding.ASCII.GetBytes(responsestring);
            }
            finally
            {
                _communicationLogger.LogCommunication(uri, client.Headers.ToString(), DataSent, responsestring);
            }
        }

        return response;
    }
Run Code Online (Sandbox Code Playgroud)

我们传入一个以https://开头的URI

这已经很长时间了.今天,我们开始收到以下连接错误:"基础连接已关闭:发送时发生意外错误".我们对服务器的所有者进行了一些故障排除,他们最终将其缩小到以下内容.他们对服务器进行了更改以阻止TLS 1.0,并表示我们现在需要使用TLS 1.1或1.2发送数据.

我需要在我的WebClient对象(或我的函数中的其他位置)中设置什么才能使用TLS 1.1或1.2而不是TLS 1.0?

我们正在使用.NET Framework 4.5,如果这有所作为.

.net c# ssl webclient

35
推荐指数
1
解决办法
3万
查看次数