所以,我写了一个小的Webserver。首先,我试图只发送文本,但现在我也试图发送图片。 (或包含图片的html-Page)
这是我尝试过的:
if ((Path.GetExtension(filename).ToLower() == "jpg") || (Path.GetExtension(filename).ToLower() == "png") || (Path.GetExtension(filename).ToLower() == "gif"))
{
Image image = Image.FromFile(filename);
MemoryStream ms = new MemoryStream();
image.Save(ms, image.RawFormat);
responseContent = Encoding.Default.GetString(ms.ToArray());
responseheader = "HTTP/1.1 200 OK\r\n" +
"Server: MiniWebServer\r\n" +
"Content-Length: " + responseContent.Length + "\r\n" +
"Content-Language: de\r\n" +
"Connection: close\r\n\r\n";
}
finalResponse = responseheader + responseContent;
return Encoding.ASCII.GetBytes(finalResponse);
所以,我试图在浏览器中打开html文件(包含图片),但它没有显示出来。然后,我尝试仅在浏览器中打开图片,但随后出现一个错误,表示无法显示图形,因为它包含错误。
答案 0 :(得分:2)
您将所有内容编码为字符串。
对于HTTP标头,这很好,因为所有浏览器都希望标头可以这种方式读取,并且必须像现在一样使用ASCII进行编码。
如果您要发送文本,也可以,因为大多数浏览器在您未指定内容类型时默认为ASCII模式。
但是对于图片和其他数据,必须在您的回复中发生以下情况。
设置内容类型标头,指定您要发送的内容的类型。 例子是
内容类型:image / gif
或
内容类型:image / png
现在,浏览器(或接收内容的任何内容)知道会发生什么。除此之外,您使用ASCII编码对图像进行编码。
ASCII仅用于将简单测试编码为字节。 (我说的很简单,因为ASCII只支持非常少的字符集。它不支持多种语言等。像Unicode,UTF和其他一些编码那样。)
这会导致ASCII以文本形式读取您的图像,并剥离或损坏它不理解的字母。 (这是您的大部分图像数据。)
您要做的是,以Content-Type
标题中指定的格式发送响应的其余部分(图像,标题之后)。只需从ms.ToArray
电话发送结果。
理想情况下,您将确保图像采用您指定的正确格式,并且不依赖于文件扩展名,但实际上,许多服务器都在讨论内容类型并指定image/*
并让浏览器搞清楚了。
Here's a good example on how to build a web server in C#.
希望这有帮助。
另一方面,你的实现不好的是内存消耗。您正在使用内存流将整个映像加载到内存,然后将其复制到阵列。这是每个请求在内存中的2个副本。我不确定你想要多少可扩展性。但是,如果您同时获得10个高分辨率图像请求(例如5 MB,对于800万像素摄像机拍摄的典型照片?),现在您的服务器突然将100 MB数据加载到内存中。
如果您在接收来自用户的文件并在写入文件之前将其加载到内存中,这可能会成为一个更大的问题。如果用户决定上传1 GB的文件,它将关闭您的服务器。 (我在一些使用ASP.NET编写的网站中看到了这种情况,这非常糟糕。故障部分是ASP.NET的优化。)
您可以做的是打开文件流,并将字节复制到响应中而不加载整个图像。以上链接显示了此代码。