我有大量的数据(~100k),我的C#app正在安装mod_gzip发送到我的Apache服务器.我正在尝试使用System.IO.Compression.GZipStream首先gzip数据.PHP接收原始的gzip压缩数据,因此Apache并没有像我期望的那样解压缩它.我错过了什么吗?
System.Net.WebRequest req = WebRequest.Create(this.Url);
req.Method = this.Method; // "post"
req.Timeout = this.Timeout;
req.ContentType = "application/x-www-form-urlencoded";
req.Headers.Add("Content-Encoding: gzip");
System.IO.Stream reqStream = req.GetRequestStream();
GZipStream gz = new GZipStream(reqStream, CompressionMode.Compress);
System.IO.StreamWriter sw = new System.IO.StreamWriter(gz, Encoding.ASCII);
sw.Write( large_amount_of_data );
sw.Close();
gz.Close();
reqStream.Close()
System.Net.WebResponse resp = req.GetResponse();
// (handle response...)
Run Code Online (Sandbox Code Playgroud)
我不完全确定"Content-Encoding:gzip"适用于客户端提供的头文件.
我试图从公共URL下载一个大文件.它起初似乎运行良好,但1/10计算机似乎超时.我最初的尝试是使用,WebClient.DownloadFileAsync但因为它永远不会完成我回到使用WebRequest.Create并直接读取响应流.
我使用的第一个版本WebRequest.Create发现了同样的问题WebClient.DownloadFileAsync.操作超时,文件未完成.
如果下载超时,我的下一个版本会添加重试.这是奇怪的.下载最终完成1次重试以完成最后7092字节.因此,文件的下载大小完全相同但文件已损坏且与源文件不同.现在我希望腐败在最后7092字节,但事实并非如此.
使用BeyondCompare我发现损坏的文件中缺少2个字节块,总计缺少7092个字节!在下载超时并重新启动之前,这个丢失的字节位于1CA49FF0和1E31F380之前.
这可能会发生什么?有关如何进一步追踪此问题的任何提示?
这是有问题的代码.
public void DownloadFile(string sourceUri, string destinationPath)
{
//roughly based on: http://stackoverflow.com/questions/2269607/how-to-programmatically-download-a-large-file-in-c-sharp
//not using WebClient.DownloadFileAsync as it seems to stall out on large files rarely for unknown reasons.
using (var fileStream = File.Open(destinationPath, FileMode.Create, FileAccess.Write, FileShare.Read))
{
long totalBytesToReceive = 0;
long totalBytesReceived = 0;
int attemptCount = 0;
bool isFinished = false;
while (!isFinished)
{
attemptCount += 1;
if (attemptCount > 10) …Run Code Online (Sandbox Code Playgroud) 我在已分配5个IP的服务器上运行此应用程序.我使用HttpWebRequest从网站获取一些数据.但是当我建立连接时,我能够指定连接的5个IP中的哪一个.HttpWebRequest是否支持此功能?如果不能,我可以从中继承一个类来改变它的行为吗?我在这里需要这样的想法.
我的代码现在是这样的:
System.Net.WebRequest request = System.Net.WebRequest.Create(link);
((HttpWebRequest)request).Referer = "http://application.com";
using (System.Net.WebResponse response = request.GetResponse())
{
StreamReader sr = new StreamReader(response.GetResponseStream());
return sr.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud) 以下代码用于下载zip文件并在手机上解压缩.
用于对WP7的工作相同的代码,我开始WP8设备上进行测试,而奇怪的事情正在发生的事情......现在它可以在WP8,但不是在WP7了.
在WP7上它给出了一个错误:
Wrong Local header signature: 0x6D74683C
Run Code Online (Sandbox Code Playgroud)
有人能告诉我这里有什么问题吗?
观察(发布问题后2天)
我有一些观察......在这里详细分享(图像格式)或(Excel格式)
代码
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Diagnostics;
using System.IO;
using System.IO.IsolatedStorage;
using System.Net;
namespace iq_main.Network
{
public class IQ_Download
{
private string zipFilePassword = String.Empty;
private string fileNameToBeStoredAs = String.Empty;
private string urlToBeDownloaded = String.Empty;
private HttpWebResponse response;
public void Download(string _urlToBeDownloaded = GlobalConstants.DownloadLanguageConfigurationUrl, string _fileNameToBeStoredAs = GlobalConstants.DownloadLanguageConfigurationXmlFilename, string _zipFilePassword = GlobalConstants.DownloadZipsPassword)
{
urlToBeDownloaded = _urlToBeDownloaded;
fileNameToBeStoredAs = _fileNameToBeStoredAs; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用.NET WebRequest/WebResponse类来访问Twitter流API "http://stream.twitter.com/spritzer.json".
我需要能够打开连接并从打开的连接中逐步读取数据.
目前,当我调用WebRequest.GetResponse方法时,它会一直阻塞,直到整个响应被下载.我知道有一种BeginGetResponse方法,但这只会在后台线程上做同样的事情.在下载仍在进行时,我需要访问响应流.对于这些类,这对我来说似乎不太可能.
Twitter文档中有关于此的具体评论:
"请注意,某些HTTP客户端库仅在服务器关闭连接后才返回响应主体.这些客户端不能用于访问Streaming API.您必须使用将以递增方式返回响应数据的HTTP客户端.最强大的HTTP客户端库将提供此功能.例如,Apache HttpClient将处理此用例."
他们指向Appache HttpClient,但这没有多大帮助,因为我需要使用.NET.
是否可以使用WebRequest/WebResponse,或者我是否必须选择较低级别的网络类?也许有其他库可以让我这样做?
艾伦
自从我升级到Windows 8后,很多依赖于启动隐形IE的PowerShell脚本将不再适用,所以我尝试切换到Invoke-WebRequest命令.我做了很多谷歌搜索,但仍然无法让我的脚本工作.
这是应该做的:
借助于令人难以置信的微软技术网示例的"帮助"(至少对我而言),我将以下内容拼凑在一起:
$myUrl = "http://some.url"
$response = Invoke-WebRequest -Uri $myUrl -Method Default -SessionVariable $rb
$form = $response.Forms[0]
$form.Fields["user"] = "username"
$form.Fields["password"] = "password"
$response = Invoke-WebRequest -Uri $form.Action -WebSession $rb -Method POST
$response.StatusDescriptionOK
Run Code Online (Sandbox Code Playgroud)
我收到两个错误,第一个是在尝试写入"user"字段时:
无法索引到空数组.
$ form.Fields ["user"] ="用户名"
Run Code Online (Sandbox Code Playgroud)+ CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : NullArray
第二个与$form.Action我不知道应该阅读的内容有关:
Invoke-WebRequest:无法验证参数'Uri'的参数.参数为null或空.提供非null或空的参数,然后再次尝试该命令.
我再次依赖微软的例子#2.
编辑:感谢hammar的资本化.我的举止在哪里?;)
我正在尝试使用WebClient/ 访问网站上的受限数据WebRequest.该网站没有官方API,所以我要做的就是填写HTML表单并将值发布到服务器,这样我就登录了.
后一个例子更吸引人,因为我显然更喜欢WebClient,但遗产WebRequest会做.
无论如何,在第一个例子中,我认为它确实登录了,但即将到来的访问私有数据的请求返回一个页面,其中包含消息"这是仅限会员的内容".
如何WebClient永久登录?
我得到了
"System.Net.ProtocolViolationException:在调用Web请求的"BeginGetResponse"方法时,必须在调用[Begin] GetResponse"错误之前将ContentLength字节写入请求流.
这是我的代码:
try
{
Stream dataStream = null;
WebRequest Webrequest;
Webrequest = WebRequest.Create(this.EndPointAddress);
Webrequest.Credentials = new NetworkCredential(this.username, this.password);
Webrequest.ContentType = "text/xml";
Webrequest.Method = WebRequestMethods.Http.Post;
byteArray = System.Text.Encoding.UTF8.GetBytes(xmlRequest.Children[0].InnerXML);
Webrequest.ContentLength = byteArray.Length;
dataStream = Webrequest.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
RequestState rs = new RequestState();
rs.Request = Webrequest;
IAsyncResult r = (IAsyncResult)Webrequest.BeginGetResponse(new AsyncCallback(RespCallback), rs);
}
catch (Exception exc)
{
TRACE.EXCEPTION(exc);
}
finally
{
dataStream.Close();
}
Run Code Online (Sandbox Code Playgroud)
更具体地说,在调用函数"getRequestStream()"之后,Stream正在为长度抛出此异常:
'stream.Length'抛出了'System.NotSupportedException'类型的异常
可能是什么原因造成的?
在多线程环境中(像大多数Web平台一样),我经常在我的应用程序的日志中包含某种线程ID.这使我能够确切地告诉哪些日志条目来自哪个请求/线程,当有多个请求同时写入同一个日志时.
在.NET/C#中,这可以通过log4net的格式化程序来完成,默认情况下包括当前线程ManagedThreadId(数字)或Name(给定名称).这些属性唯一标识一个线程(例如:参见:如何使用log4net使用Threadpool线程记录正确的上下文?
在PHP中,我没有发现任何类似的东西(我问谷歌,PHP文档和SO).它存在吗?
我有一个多IP地址的服务器.现在我需要使用http协议与多个服务器通信.每个服务器只接受来自我的服务器的指定IP地址的请求.但是在.NET中使用WebRequest(或HttpWebRequest)时,请求对象将自动选择IP地址.无论如何我都找不到用地址绑定请求.
反正有没有这样做?或者我必须自己实施webrequest课程?
webrequest ×10
c# ×8
download ×2
forms ×2
web ×2
.net ×1
exception ×1
file ×1
gzip ×1
gzipstream ×1
http ×1
ip ×1
ip-address ×1
logging ×1
login ×1
php ×1
powershell ×1
streaming ×1
webclient ×1
webresponse ×1