HttpWebRequest.GetResponse()在尝试发布文件时总是在计时 [英] HttpWebRequest.GetResponse() Always Timing Out When Trying to Post File

查看:75
本文介绍了HttpWebRequest.GetResponse()在尝试发布文件时总是在计时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨!

尝试将文件发布到php脚本时遇到问题。



我知道100%确保URL正确并且可以访问php脚本。我100%知道我要上传的文件存在。



当我尝试上传时,.GetResponse()方法超时。有时它抛出异常:底层连接已关闭:接收时发生意外错误



这是我的文件上传代码:

  public   static   string  PostData( string  strUrl, string  strFileToUpload)
{
< span class =code-keyword> try
{
const string strFileFormName = file;
var oUri = new Uri(strUrl);
var strBoundary = ---- ------ + DateTime.Now.Ticks.ToString( x);

// 尾随边界字符串
var boundaryBytes = Encoding.ASCII.GetBytes( \\\\ n - + strBoundary + \\\\ n);

// 帖子邮件标题
var sb = new StringBuilder();
sb.Append( - );
sb.Append(strBoundary);
sb.Append( \\\\ n);
sb.Append( Content-Disposition:form-data; name = \);
sb.Append(strFileFormName);
sb.Append( \ ; filename = \);
sb.Append(Path.GetFileName(strFileToUpload));
sb.Append( \);
sb.Append( \\\\ n);
sb.Append( Content-Type:);
sb.Append( application / octet-stream);
sb.Append( \\\\ n);
sb.Append( \\\\ n);
var strPostHeader = sb.ToString();
var postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);

// WebRequest
var oWebrequest =(HttpWebRequest)WebRequest.Create(oUri);
oWebrequest.ContentType = multipart / form-data; boundary = + strBoundary;
oWebrequest.Method = POST;
oWebrequest.Timeout = Timeout.Infinite;
oWebrequest.KeepAlive = true ;
// 这很重要,否则无论如何整个文件都将被读入内存......
oWebrequest.AllowWriteStreamBuffering = true ;

// 获取FileStream并设置WebRequest的最终属性
var oFileStream = new FileStream(strFileToUpload,FileMode.Open,FileAccess.Read);
var length = postHeaderBytes.Length + oFileStream.Length + boundaryBytes.Length;
oWebrequest.ContentLength = length;
var oRequestStream = oWebrequest.GetRequestStream();

// 写邮件标题
oRequestStream.Write( postHeaderBytes, 0 ,postHeaderBytes.Length);

// 将文件内容分成小块(最多4096字节)。
// byte [] buffer = new Byte [checked((uint)Math.Min(4096) ,(int)oFileStream.Length))];
var buffer = new 字节 [已检查(( uint ) oFileStream.Length)];
var bytesRead = 0 ;
while ((bytesRead = oFileStream.Read(buffer, 0 ,buffer.Length)) != 0
oRequestStream.Write(buffer, 0 ,bytesRead);
oFileStream.Close();

// 添加尾随边界
oRequestStream.Write( boundaryBytes, 0 ,boundaryBytes.Length);
var oWResponse = oWebrequest.GetResponse();
var s = oWResponse.GetResponseStream();
if (s!= null
{
var sr = new StreamReader(s);
var sReturnString = sr.ReadToEnd();

// 清理
oFileStream.Close();
oRequestStream.Close();
s.Close();
sr.Close();

return sReturnString;
}
}
catch { return 字符串 .Empty; }
return String .Empty;
}





这是我在服务器端的PHP代码:

< pre lang =PHP> <?php
require(' vars.php');
$ dbHost = DB_HOST; // MySQL主机
$ dbUser = DB_USER; // MySQL用户名
$ dbPass = DB_PASSWORD; // MySQL密码
$ dbDatabase = DB_NAME; // MySQL数据库名称
function connect_database(){
global $ dbHost,$ dbUser,$ dbPass, $ dbDatabase ;
$ mysql = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD);
if (!$ mysql){
$ html 。= 数据库错误。$ header。 无法连接数据库,请检查配置。。$ footer;
die($ html);
}
if (!mysql_select_db($ dbDatabase,$ mysql)){
mysql_close($ mysql);
$ html 。= 数据库错误 。$ header。 无法选择'。$ dbDatabase。 '数据库,请检查配置。。$ footer;
die($ html);
}
return $ mysql ;
}
connect_database();
$ ID = getRandomString();
$ Location = stats /.$ID. 。html;
if(is_uploaded_file($ _ FILES [' file'] [' tmp_name']))
{
if (move_uploaded_file($ _ FILES [' file'] [' tmp_name'] [0],$ Location)){
mysql_query( INSERT INTO`user_stat_links`(`s_id`)VALUES('。$ ID。 ')
die(mysql_error());
echo http:// myurl。 COM /统计/ ID = $ ID?。
退出;
}
}
echo 错误;
?>





我非常困惑这个。我之前使用过这个c#代码来上传文件,它已经100%正常工作了。



请帮忙!

解决方案

dbHost = DB_HOST; // MySQL主机


dbUser = DB_USER; // MySQL用户名


dbPass = DB_PASSWORD; // MySQL密码


Hi !
I'm having an issue when trying to post a file to a php script.

I know 100% sure that the URL is correct and the php script is accessible. I know 100% that the file I'm trying to upload exists.

When I try and upload, the .GetResponse() method times out. Sometimes it throws the exception: "The underlying connection was closed: An unexpected error occurred on a receive"

Here's my file upload code:

public static string PostData(string strUrl, string strFileToUpload)
{
    try
    {
        const string strFileFormName = "file";
        var oUri = new Uri(strUrl);
        var strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");

        // The trailing boundary string
        var boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");

        // The post message header
        var sb = new StringBuilder();
        sb.Append("--");
        sb.Append(strBoundary);
        sb.Append("\r\n");
        sb.Append("Content-Disposition: form-data; name=\"");
        sb.Append(strFileFormName);
        sb.Append("\"; filename=\"");
        sb.Append(Path.GetFileName(strFileToUpload));
        sb.Append("\"");
        sb.Append("\r\n");
        sb.Append("Content-Type: ");
        sb.Append("application/octet-stream");
        sb.Append("\r\n");
        sb.Append("\r\n");
        var strPostHeader = sb.ToString();
        var postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);

        // The WebRequest
        var oWebrequest = (HttpWebRequest)WebRequest.Create(oUri);
        oWebrequest.ContentType = "multipart/form-data; boundary=" + strBoundary;
        oWebrequest.Method = "POST";
        oWebrequest.Timeout = Timeout.Infinite;
        oWebrequest.KeepAlive = true;
        // This is important, otherwise the whole file will be read to memory anyway...
        oWebrequest.AllowWriteStreamBuffering = true;

        // Get a FileStream and set the final properties of the WebRequest
        var oFileStream = new FileStream(strFileToUpload, FileMode.Open, FileAccess.Read);
        var length = postHeaderBytes.Length + oFileStream.Length + boundaryBytes.Length;
        oWebrequest.ContentLength = length;
        var oRequestStream = oWebrequest.GetRequestStream();

        // Write the post header
        oRequestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

        // Stream the file contents in small pieces (4096 bytes, max).
        //byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)oFileStream.Length))];
        var buffer = new Byte[checked((uint)oFileStream.Length)];
        var bytesRead = 0;
        while ((bytesRead = oFileStream.Read(buffer, 0, buffer.Length)) != 0)
            oRequestStream.Write(buffer, 0, bytesRead);
        oFileStream.Close();

        // Add the trailing boundary
        oRequestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
        var oWResponse = oWebrequest.GetResponse();
        var s = oWResponse.GetResponseStream();
        if (s != null)
        {
            var sr = new StreamReader(s);
            var sReturnString = sr.ReadToEnd();

            // Clean up
            oFileStream.Close();
            oRequestStream.Close();
            s.Close();
            sr.Close();

            return sReturnString;
        }
    }
  catch { return String.Empty; }
    return String.Empty;
}



here's my PHP code on the server end:

<?php
require('vars.php');
   $dbHost     = DB_HOST;		// MySQL host
   $dbUser     = DB_USER;	// MySQL username
   $dbPass     = DB_PASSWORD;	// MySQL password
   $dbDatabase = DB_NAME;	// MySQL database name
	function connect_database() {
		global $dbHost, $dbUser, $dbPass, $dbDatabase;
		$mysql = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
		if (!$mysql) {
			$html .= "Database Error".$header."Can not connect to database, please check the configuration.".$footer;
			die($html);
		}
		if (!mysql_select_db($dbDatabase, $mysql)) {
			mysql_close($mysql);
			$html .= "Database Error".$header."Can not select '".$dbDatabase."' database, please check the configuration.".$footer;
			die($html);
		}
		return $mysql;
	}
	connect_database();
			$ID = getRandomString();
			$Location = "stats/".$ID.".html";
			if(is_uploaded_file($_FILES['file']['tmp_name']))
			{
				if (move_uploaded_file($_FILES['file']['tmp_name'][0], $Location)) {
					mysql_query("INSERT INTO `user_stat_links` (`s_id`)VALUES('".$ID."')")
						or die(mysql_error());
					echo "http://myurl.com/stats/?id=".$ID;
					exit;
				}
			}
			echo "error";
?>



I'm extremely baffled by this. I've used this c# code before to upload files and it has worked 100% fine.

Please help!

解决方案

dbHost = DB_HOST; // MySQL host


dbUser = DB_USER; // MySQL username


dbPass = DB_PASSWORD; // MySQL password


这篇关于HttpWebRequest.GetResponse()在尝试发布文件时总是在计时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆