我正在使用从服务器下载一些文件的DownloadFileAsync方法WebClient,我不禁注意到在VS2010中我的代码的非正式测试中,它在启动时会阻塞大约3秒钟,在我看来,首先打败了目的.
以下是相关的代码片段:
WebClient downloader = new WebClient();
downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(updateDownloadProgress);
downloader.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(downloadCompleted);
var current_map = map_downloads[0];//string with filename, map_downloads is List<string>
var path = System.IO.Path.GetTempFileName();
downloaded_maps.Add(path);//adding the temp file to a List<string>
downloader.DownloadFileAsync(new Uri(MAP_BASE + current_map), path); //MAP_BASE is a string containing the base url
Run Code Online (Sandbox Code Playgroud)
DownloadFileAsync当应用程序下载~100 MB文件时,我正在使用UI阻止阻止.显然,如果UI在呼叫开始时阻塞了3秒,那么即使不完全,也会稍微减少效用.
我对C#/ .Net相对缺乏经验(大约3 - 4年前我做了一堆.Net 2.0的东西,IIRC,但我现在基本上重新学习它).
背景
我正在开发一个ASP.Net服务器端控件,需要与ASMX Web服务进行通信.服务器端控件使用WebClient对象与Web服务进行通信,因为它需要经常在各种应用程序中重用,并且为了使开发人员更容易,他们不需要创建对Web服务的服务引用.
履行
在使用控件期间,需要将序列化对象发送到Web服务.使用the XmlSerializer对序列化对象,然后使用chilkat压缩库压缩生成的XML字符串.控件的Web服务调用如下所示:
webClient.UploadStringAsync(new Uri(serviceHost + serviceMethod), "POST", sendData)
sendData(string)的内容是compressedResponse={CompressedData}.
Web服务有一个定义如下的方法来接收数据,然后使用chilkat库解压缩字符串值,然后使用该序列对对象进行反序列化XmlSerializer.
public void SaveResponse(string compressedResponse)
控制和服务之间的通信正在进行.最初web.config,在上述任何一项中都没有定义任何设置或绑定.初步搜索后,我确实添加了
<httpRuntime maxRequestLength="20480"/>
客户端和服务器web.config文件.这没有任何区别.
问题
压缩或未压缩在sendData变量中发布到Web服务的数据对于正常的POST请求来说很大,并且已损坏.在以压缩格式将字符串发布到服务器之前和之后检查字符串的最后几个字符时,会确认这一点,并且在解压缩时,Xml文档在检入调试器时缺少最后一个根标记.在string无法解压缩,因此,服务调用失败每次.
如何增加WebClient请求的POST大小以确保服务器收到完整的字符串?
我已经查看了Google上的各种选项,但没有一个能够给我一个足够好的样本,可以在哪里进行更改,或者样本的变化需要看起来像.我完全不知道是否需要在服务器或消费网站上进行更改,并且因为没有为此定义绑定,如何在web.configASMX HTTP服务调用中创建绑定.
我正在编写一个类库,以便在我无法控制的站点上执行操作.该网站接受表格帖子作为输入.
谁能告诉我这两种方法之间是否存在差异,除了要上传的数据形式?
System.Net.WebClient.UploadData(Uri, Byte[]);
System.Net.WebClient.UploadValues(String, NameValueCollection);
Run Code Online (Sandbox Code Playgroud)
我不反对以任何方式安排数据,但开始想知道实际上有什么区别,并且它仍然以某种奇怪的方式唠叨我,不知道是否存在差异.
我很难尝试使用webclient对accounts.google.com进行身份验证
我正在使用C#WebClient对象来实现以下功能.
我将表单字段提交到https://accounts.google.com/ServiceLoginAuth?service=oz
这是POST字段:
service=oz
dsh=-8355435623354577691
GALX=33xq1Ma_CKI
timeStmp=
secTok=
Email=test@test.xom
Passwd=password
signIn=Sign in
PersistentCookie=yes
rmShown=1
Run Code Online (Sandbox Code Playgroud)
现在,在我提交数据之前加载登录页面时,它有以下标题:
Content-Type text/html; charset=UTF-8
Strict-Transport-Security max-age=2592000; includeSubDomains
Set-Cookie GAPS=1:QClFh_dKle5DhcdGwmU3m6FiPqPoqw:SqdLB2u4P2oGjt_x;Path=/;Expires=Sat, 21-Dec-2013 07:31:40 GMT;Secure;HttpOnly
Cache-Control no-cache, no-store
Pragma no-cache
Expires Mon, 01-Jan-1990 00:00:00 GMT
X-Frame-Options Deny
X-Auto-Login realm=com.google&args=service%3Doz%26continue%3Dhttps%253A%252F%252Faccounts.google.com%252FManageAccount
Content-Encoding gzip
Transfer-Encoding chunked
Date Thu, 22 Dec 2011 07:31:40 GMT
X-Content-Type-Options nosniff
X-XSS-Protection 1; mode=block
Server GSE
Run Code Online (Sandbox Code Playgroud)
好了,现在我如何使用WebClient Class来包含这些标题?
我尝试过,webClient_.Headers.Add();但效果有限,总是返回登录页面.
以下是我使用的课程.非常感谢任何帮助.
获取登录页面
public void LoginPageRequest(Account acc)
{
var rparams = new RequestParams();
rparams.URL = @"https://accounts.google.com/ServiceLoginAuth?service=oz"; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用控制台应用程序将XML文件发送到在ASP.NET MVC 3中开发的Web应用程序,并接收另一个XML作为响应.
控制台应用程序中返回的错误是:
远程服务器返回错误:(500)内部服务器错误.
当我让Fiddler2运行时,我看到了这个错误:
你调用的对象是空的.
控制台应用程序中的代码是:
static void Main(string[] args)
{
var wc = new WebClient();
byte[] response = wc.UploadFile("http://mysite.com/Tests/Test", "POST", "teste.xml");
string s = System.Text.Encoding.ASCII.GetString(response);
Console.WriteLine(s);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
MVC控制器中的代码是:
[HttpPost]
public ActionResult Test(HttpPostedFileBase file)
{
XElement xml = XElement.Load(new System.IO.StreamReader(file.InputStream));
var test = new MyTest();
return File(test.RunTest(xml), "text/xml", "testresult.xml");
}
Run Code Online (Sandbox Code Playgroud)
RunTest()效果很好,因为这个方法在我通过表单上传文件时使用(在同名的方法中,使用方法GET).RunTest()返回带响应的XML.
当我调试MVC应用程序时,我看到了问题:变量file为null!
我该如何解决这个问题?我需要在我的控制台应用程序中更改它才能实际发送文件?或者是改变MVC方法的情况?
并且,在尝试使用之前WebClient,我在这里尝试了这个代码:http://msdn.microsoft.com/en-us/library/debx8sh9.aspx,并得到了相同的结果.
所以我找了答案多次,并且经许可的东西围绕插手无济于事,但是这个代码仍然不会让我一个文件下载到指定的路径.
WebClient client = new WebClient();
client.DownLoadFile("http://dl.dropbox.com/u/(My account)/Installer.jar", @"c:\Games\Name\libs");
client.DownLoadFile("http://dl.dropbox.com/u/(My account)/Name.zip", @"c:\Games\Name");
Run Code Online (Sandbox Code Playgroud)
总是给我:"访问路径'c:\ Games\Name\libs'被拒绝."
另请注意,使用Windows XP SP3.
是否可以设置标题WebChannelFactory?如果我使用的是WebClient对象,我可以这样做:
WebClient client = new WebClient();
client.Headers.Add("referer", "http://stackoverflow.com");
client.Headers.Add("user-agent", "Mozilla/5.0");
Run Code Online (Sandbox Code Playgroud)
但是我还没有找到修改标题的方法WebChannelFactory.
我已经通过WebClient对象从Artifactory(Generic Repo)成功下载了一个文件.我通过相同的方法上传文件时遇到了麻烦.我试图找出通过Powershell上传到我们服务器的最简单方法.
请注意,此时安装其他实用程序(如Curl)不是一个选项.我正在编写自动化脚本,并希望坚持使用基本的Windows 2008 r2服务器,不需要安装其他实用程序,因为我无法指望它们在所有服务器上都存在.
如果某人有一个使用Rest API的示例脚本,那将是完美的!
下载代码的示例(这适用):
$SOURCE = "https://artifactory.example.com/artifactory/net-generic-local/APP/BF_1.0.zip"
$DESTINATION = ".\BF_1.0.zip"
$AF_USER ="user"
$AF_PWD ="password"
$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($AF_USER,$AF_PWD)
$WebClient.DownloadFile($SOURCE,$DESTINATION)
Run Code Online (Sandbox Code Playgroud)
这是上传代码的示例(不起作用):
$SOURCE = ".\BF_2.0.zip"
$DESTINATION = "https://artifactory.example.com/artifactory/net-generic-local/APP/BF_2.0.zip"
$AF_USER ="user"
$AF_PWD ="password"
$WebClient = New-Object System.Net.WebClient
$WebClient.Credentials = New-Object System.Net.NetworkCredential($AF_USER, $AF_PWD)
$URI = New-Object System.Uri($DESTINATION)
$WebClient.UploadFile($URI,$SOURCE)
Run Code Online (Sandbox Code Playgroud)
这是我从上传中得到的错误:
Exception calling "UploadFile" with "2" argument(s): "The remote server returned an error: (405) Method Not Allowed."
At E:\transient\af_put.ps1:8 char:1
+ $WebClient.UploadFile($URI,$SOURCE)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Asp.NET Core 创建一个 Web API,该 API 公开路由以启动和取消大文件的长时间下载。服务器应该能够同时处理多个下载。
WebClient.DownloadFileAsync为了有一个短的响应时间并返回一个downloadId供以后使用。WebClient 的实例作为值存储在一个静态字典中,其对应key的自然是downloadId.WebClient.CancelAsync通过访问与downloadId键对应的字典的值检索到的客户端实例上取消下载。当下载完成而不被取消时,以下代码完美运行;AsyncCompletedEventHandler(OnDownloadFileCompleted在这种情况下)被正确调用。
问题:调用 时WebClient.CancelAsync,文件会继续下载并且OnDownloadFileCompleted不会立即调用。WebClient 似乎在调用处理程序之前等待下载完成。然而,在这两种情况下,属性都AsyncCompletedEventArgs.Canceled被正确设置(例如,true如果WebClient.CancelAsync确实被调用了。
任何帮助将不胜感激!
下载控制器.cs
[Route ("api/download")]
public class DownloadController {
private readonly DownloadService service;
public DownloadController (DownloadService service) {
this.service = service;
}
[Route ("start")]
[HttpPost]
public string Start ([FromForm] string fileUrl) => this.service.StartDownload (fileUrl);
[Route ("cancel")]
[HttpPost] …Run Code Online (Sandbox Code Playgroud) 我做不到
from slack import WebClient
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
导入错误:无法导入名称“WebClient”
已安装 slack 模块
pip install slack
Run Code Online (Sandbox Code Playgroud)
错误:
回溯(最近一次调用):文件“E:\Downloads\slack-automation-master\channel_messages.py”,第 3 行,在 from slack import WebClient ImportError: cannot import name 'WebClient'
webclient ×10
c# ×7
.net ×2
api ×1
artifactory ×1
asmx ×1
asp.net ×1
asp.net-core ×1
cookies ×1
download ×1
file ×1
file-upload ×1
http-post ×1
performance ×1
post ×1
powershell ×1
python ×1
rest ×1
slack ×1
wcf ×1
web-services ×1
windows ×1