C# 如何从非活动但与活动服务器连接的服务器设置Img scr
我想显示登录员工的照片,但我们公司不想公开所有员工的照片,这就是为什么我们将员工照片放在一个非实时服务器上,但与实时服务器连接的原因 现在的问题是,当我在localhost上运行我的网站时,会显示员工的照片,但一旦我在IIS上发布,它就不会显示图像C# 如何从非活动但与活动服务器连接的服务器设置Img scr,c#,asp.net,iis,authentication,C#,Asp.net,Iis,Authentication,我想显示登录员工的照片,但我们公司不想公开所有员工的照片,这就是为什么我们将员工照片放在一个非实时服务器上,但与实时服务器连接的原因 现在的问题是,当我在localhost上运行我的网站时,会显示员工的照片,但一旦我在IIS上发布,它就不会显示图像 请建议解决方案。很可能,客户端无法访问图像所在的服务器。该映像由客户端从映像服务器下载。它不是从IIS服务器下载的 查看页面源代码并查找图像的src属性。您需要将来自客户端的请求通过公用IIS服务器代理到内部服务器,以便将映像返回到客户端。当然,如果
请建议解决方案。很可能,客户端无法访问图像所在的服务器。该映像由客户端从映像服务器下载。它不是从IIS服务器下载的
查看页面源代码并查找图像的src属性。您需要将来自客户端的请求通过公用IIS服务器代理到内部服务器,以便将映像返回到客户端。当然,如果没有身份验证,您将无法实现将图像放在内部服务器上的最初目的。您的intranet可能是为了让面向公众的web服务器能够“查看”照片所在的服务器而设置的,但照片服务器本身不是面向公众的。该网站包含指向照片服务器上照片的链接,但由于该服务器不是面向公众的,因此照片不会显示(在localhost上运行时除外,localhost可以看到照片服务器) 此代码段显示了在.NET中执行此操作的一种方法的基本原理:
protected void Page_Load(object sender, EventArgs e)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "image/jpeg";
using (Bitmap bmp =
(Bitmap)Bitmap.FromFile(
@"\\internal-photoserver\shared drive\bobsmith.jpg"))
{
bmp.Save(
HttpContext.Current.Response.OutputStream,
ImageFormat.Jpeg);
}
HttpContext.Current.Response.End();
}
// needs these two using statements:
using System.Drawing;
using System.Drawing.Imaging;
基本上,服务器不使用指向图像文件的链接呈现页面,而是读取文件并将其与页面的其余部分一起流式传输到客户端(因此浏览器不需要访问照片服务器)。只要web服务器可以看到“InternalPhotoServer”,此代码就会工作并在调用客户端的浏览器中显示照片,即使该客户端无法访问“InternalPhotoServer”
上面的代码示例将显示照片,但这将是整个页面。我对ASP.NET有些生疏,但我相信这段代码有一种简单的方法可以将图像渲染到占位符,这样您就可以在照片周围显示其他内容
免责声明:我必须添加以下建议:
小心
系统中的类。绘图
不支持使用命名空间
在Windows或ASP.NET服务中。
正在尝试从中使用这些类
在其中一种应用程序类型中
可能会产生意想不到的问题,例如
由于服务表现下降和
运行时异常
合理的建议(尽管他们在这里说的不是让图形类超快速但不安全,或者超安全但缓慢,而是选择了不安全和缓慢),而且可能用普通的ol'System.IO
来实现这一点,尽管我猜这不适用于所有平台(因为经久不衰等等)
更新:是的,这更简单、更安全:
protected void Page_Load(object sender, EventArgs e)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "image/jpeg";
byte[] bytes = File.ReadAllBytes(
@"\\internal-photoserver\shared drive\bobsmith.jpg");
HttpContext.Current.Response.OutputStream.Write(bytes, 0, bytes.Length);
HttpContext.Current.Response.End();
}
// need this using statement:
using System.IO;
这种方法对于大量使用服务器来说会更好,但是你需要确保图像已经是浏览器友好的格式(不是BMP)。另外,我认为如果将图像提供给与你的服务器具有不同字节顺序的平台,这种方法会失败,但我不知道
如果图像是非浏览器格式的,或者在显示之前需要对其进行某种处理(例如缩小图像并使其所有信息看起来像驾照之类,我认为像我这样的程序员是MSDN建议不要在ASP.NET中使用System.Drawing的原因),则第一种方法非常有用
最后:我意识到前两种方法在浏览器中显示图像的唯一原因是代码将内容类型更改为图像,然后发送图像的字节,因此不能使用它将图像显示为HTML页面的一部分(即,图像周围有其他文本和内容)
我唯一能想到的就是让一个页面使用上述方法将图像写入响应流,然后是另一个页面,上面有一个IFRAME,其src
设置为图像页面
iFrame坏了,或者不是。您可以使用此代码的变体,将JPEG保存到面向公众的服务器上的临时位置,然后构建登录页面,使其包含指向此临时文件的链接。当然,您必须保护此文件并最终清理它
ASP.NET可能有一种更平滑、内置的方法来处理此问题,但你永远也不知道。我正在尝试在一段相对空闲的时间后重新使用ASP.NET,因此采用这种方法更有趣。一种解决方案是设置一个HttpHandler来为照片提供服务。这样,你就可以将照片存储在t之外在提供照片之前,检查网站文件夹结构(或应用程序内数据),并执行任何必要的身份验证 是设置图像处理程序的一个很好的资源,尽管根据您的需要,所有的大小调整、缓存等操作都可能会过度。基本上,您所需要的就是这样的内容:
public class myPhototHandler: IHttpHandler
{
public bool IsReusable {
get { return true; }
}
public void ProcessRequest(System.Web.HttpContext context)
{
if (Context.User.Identity.IsAuthenticated) {
var filename = context.Request.QueryString("f") ?? String.Empty;
string completePath = context.Server.MapPath(string.Format("~/App_Data/Photos/{0}", path));
context.Response.ContentType = "image/jpeg";
context.Response.WriteFile(completePath);
}
}
}
<img src="PhotoHandler.ashx?photoName=bob_smith" alt="If Bob Smith was a cat,
I would shave his ass and make him walk backwards." />
显然,您希望加入一些错误检查、用户未经身份验证时的异常等,并在web.config文件中注册处理程序。然后只需将图像src设置为类似myPhototHandler.ashx?f=myphoto.jpg的值。ASP.NET确实有一种更平滑的内置方法来处理此问题。添加一个新的
通用Handler
到名为PhotoHandler的项目中:
<%@ WebHandler Language="C#" Class="PhotoHandler" %>
using System;
using System.Web;
public class PhotoHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
string photoName = context.Request.QueryString["photoName"];
context.Response.ContentType = "image/jpeg";
context.Response.WriteFile(
String.Format(
@"\\internal-photoserver\shared drive\{0}.jpg",
photoName));
}
public bool IsReusable {
get {
return false;
}
}
}
注意:我不确定照片服务器的路径是否能正常工作(我不记得是否支持UNC路径),因此您可能需要映射驱动器。为什么投票不通过?这是一个完全正常的ASP.NET问题。