我有一个.net应用程序,它有一个WebRequest,它给POST添加了多次相同的密钥,从而使它成为PHP,Java Servlets等眼中的数组.我想把它重写为使用WebClient,但如果我多次使用相同的键调用WebClient的QueryString.Add(),它只是附加新值,使用逗号分隔的单个值而不是值数组.
我使用WebClient的UploadFile()发布我的请求,因为除了这些元数据,我还想发布一个文件.
如何使用WebClient发布值数组而不是单个值(逗号分隔值)?
干杯
聂
我正在尝试编译WebClient类的" cookie感知 "版本- 但我似乎无法克服使用PowerShell v2中添加的Add-Type cmdlet的一些障碍.这是我试图编译的代码:
PS C:\> $def = @"
public class CookieAwareWebClient : System.Net.WebClient
{
private System.Net.CookieContainer m_container = new System.Net.CookieContainer();
protected override System.Net.WebRequest GetWebRequest(System.Uri address)
{
System.Net.WebRequest request = base.GetWebRequest(address);
if (request is System.Net.HttpWebRequest)
{
(request as System.Net.HttpWebRequest).CookieContainer = m_container;
}
return request;
}
}
"@
PS C:\> Add-Type -TypeDefinition $def
Run Code Online (Sandbox Code Playgroud)
它似乎无法找到无法找到的CookieContainer类型(虽然它是完全合格的......) - 显然我对某些东西视而不见.
编辑:更新了示例代码以使其正确并且可以复制n-pasteable,谢谢!
AFAIK XmlHttpRequest我可以使用该send方法下载和上传数据.但是WebClient有很多方法.我不想要所有的功能WebClient.我只是想创建一个模拟a的对象XmlHttpRequest,除了它没有XSS限制.我也不关心将响应作为XML或甚至现在作为字符串.如果我可以把它作为一个足够好的字节数组.
我以为我可以使用UploadData我的通用方法,但尝试使用它下载数据时失败,即使它返回响应.那么如何编写一个行为XmlHttpRequest与send方法类似的方法呢?
编辑:我在这里发现了一个不完整的类,它正是一个XmlHttpRequest模拟器.太糟糕了,整个代码都丢失了.
我很难尝试使用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) 所以我找了答案多次,并且经许可的东西围绕插手无济于事,但是这个代码仍然不会让我一个文件下载到指定的路径.
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.
我正在尝试理解Windows中C#和I/O完成端口中async/await的复杂性,编写代码以验证我的假设.
从我的理解,调用WebClient.DownloadStringTaskAsync(...)将使当前线程注册I/O操作与I/O完成端口(这可能有点模糊,我还不了解细节),它将创建一个Task<string>,它将继续执行代码.在某些时候,它将遇到await给定的任务.此时,它将从当前方法返回(好吧,它将退出某个范围,我不确定这个范围是否可能是方法以外的东西 - 我应该检查生成的状态机以了解该部分) .一旦I/O操作完成,将从线程池中获取一个线程,它将传递I/O操作的结果,并将执行刚才提到的其余范围.
我已经尝试过验证这种行为,但只有在C#代码到目前为止看起来不正确之前:
class Program
{
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(30, 30);
Console.WriteLine("Connection limit is {0}", ServicePointManager.DefaultConnectionLimit);
for (int i = 0; i < 30; i++)
{
FetchAsync(i);
}
Console.WriteLine("Done starting requests");
Console.ReadKey();
}
private async static void FetchAsync(int num)
{
WebClient wc = new WebClient();
string result = await wc.DownloadStringTaskAsync("http://localhost/slow/index/15");
Console.WriteLine("Done #{0}", num);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用a WebClient来创建30个网页请求(我知道这个请求很慢,需要15秒才能响应).运行此代码,我观察到以下行为:15秒后前10个请求完成.再过15秒后,另外10个请求完成,再过15秒后,其余请求完成.因此,似乎一次只有10个未完成的请求(使用perfmon我已经验证了被调用的Web应用程序有10个当前请求).这是为什么?我期待30个并发请求,因为我已根据上面的代码设置了线程池的最大线程数.
这个问题让我相信ServicePointManager可能与它有关,但由于DefaultConnectionLimit只有2,我认为没有联系.
我意识到这是一个相当简单的问题的冗长描述.我希望它能让人更容易指出我的假设错误的地方.
我在Windows 7,64位机器上运行它.
我正在使用WebClient.DownloadFile一次从Web服务器下载单个文件,但是,我想知道是否"线程被阻止"开发人员意味着应用程序不会响应?
我尝试使用WebClient.DownloadFileAsync,但它不能像DownloadFile一样工作,请澄清,我说不清楚,因为我正在从我的网络下载文件,所以它几乎立即下载,提前感谢.
PS:是的我试过谷歌搜索和阅读,找不到我需要的答案.
我已经通过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) 您好我正在关注本指南
static async Task<Product> GetProductAsync(string path)
{
Product product = null;
HttpResponseMessage response = await client.GetAsync(path);
if (response.IsSuccessStatusCode)
{
product = await response.Content.ReadAsAsync<Product>();
}
return product;
}
Run Code Online (Sandbox Code Playgroud)
我用这个例子在我的代码,我想知道有没有办法使用HttpClient没有async/await,我怎么能得到的唯一反应的字符串?
先感谢您
webclient ×10
c# ×9
.net ×2
powershell ×2
arrays ×1
artifactory ×1
asp.net ×1
asp.net-mvc ×1
async-await ×1
asynchronous ×1
cookies ×1
download ×1
file ×1
file-upload ×1
networking ×1
post ×1
rest ×1
threadpool ×1
wcf ×1
windows ×1
winforms ×1