C# The remote server returned an error: (500) Internal Server Error. GetRequest()
Http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition用来说明字段的一些信息;由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
C#使用HttpRequest进行Post表单传送的时候爆 (500) Internal Server Error.
原因为ContentType设置为multipart/form-data;需要改为
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data; boundary="+boundary;
附C# multipart/form-data类型上传文件、表单代码:
//上传文件所需要的参数
public class UpLoadFile
{
//上传名字
public string Name { get; set; }
//文件名
public string FileName { get; set; }
//文件全名 包含路径
public string FileFullName { get; set; }
//文件路径
public string FilePath { get; set; }
//文件Post上传路径
public string FileContentType { get; set; }
}
/// <summary>
/// 发起httpPost 请求,可以上传文件
/// </summary>
/// <param name="url">请求的地址</param>
/// <param name="upLoadFiles">上传的文件参数</param>
/// <param name="formdatastrdict">表单数据</param>
/// <param name="headersdict">头文件</param>
/// <param name="endoding">编码类型</param>
/// <returns></returns>
public static string PostResponse(string url, List<UpLoadFile> upLoadFiles, Dictionary<string, string> formdatastrdict, Dictionary<string, string> headersdict, Encoding endoding)
{
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
//添加头文件
if (headersdict != null)
{
foreach (var key in headersdict.Keys)
{
request.Headers.Add(key, headersdict[key]);
}
}
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.Method = "POST";
request.KeepAlive = true;
//request.Credentials = CredentialCache.DefaultCredentials;
request.Expect = "";
MemoryStream stream = new MemoryStream();
byte[] line = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");
byte[] enterER = Encoding.ASCII.GetBytes("\r\n");
//提交文本字段
if (formdatastrdict != null)
{
string format = "--" + boundary + "\r\nContent-Disposition:form-data;name=\"{0}\"\r\n\r\n{1}\r\n"; //自带项目分隔符
foreach (string key in formdatastrdict.Keys)
{
string s = string.Format(format, key, formdatastrdict[key]);
byte[] data = Encoding.UTF8.GetBytes(s);
stream.Write(data, 0, data.Length);
}
}
//提交文件 应放在文本后面
if (upLoadFiles != null)
{
string fformat = "Content-Disposition:form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n";
foreach (var file in upLoadFiles)
{
stream.Write(line, 0, line.Length); //项目分隔符
//application/octet-stream
string s = string.Format(fformat, file.Name, file.FileName, file.FileContentType);
byte[] data = Encoding.UTF8.GetBytes(s);
stream.Write(data, 0, data.Length);
int bytesRead;
byte[] buffer = new byte[1024];
FileStream fileStream = new FileStream(file.FileFullName, FileMode.Open, FileAccess.Read);
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
//将文件流写入FormData项中
stream.Write(buffer, 0, bytesRead);
}
//添加\r\n
stream.Write(enterER, 0, enterER.Length);
}
}
//项目最后的分隔符字符串需要带上--
byte[] foot_data = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");
stream.Write(foot_data, 0, foot_data.Length);
request.ContentLength = stream.Length;
//写入请求数据
Stream requestStream = request.GetRequestStream();
stream.Position = 0L;
stream.CopyTo(requestStream);
stream.Close();
requestStream.Close();
try
{
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
try
{
using (var responseStream = response.GetResponseStream())
using (var mstream = new MemoryStream())
{
responseStream.CopyTo(mstream);
string message = endoding.GetString(mstream.ToArray());
return message;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
}
}
catch (WebException ex)
{
//response = (HttpWebResponse)ex.Response;
//if (response.StatusCode == HttpStatusCode.BadRequest)
//{
// using (Stream data = response.GetResponseStream())
// {
// using (StreamReader reader = new StreamReader(data))
// {
// string text = reader.ReadToEnd();
// Console.WriteLine(text);
// }
// }
//}
throw ex;
}
}
catch (Exception ex)
{
throw ex;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2018-10-09 GitHub入门(一)GIT配置与Hexo博客搭建