.NET Web服务-下载文件并强制浏览器打开它

.NET Web服务-下载文件并强制浏览器打开它,.net,web-services,asmx,.net,Web Services,Asmx,我有一个Web方法,可以创建一个文件并将其提供给浏览器 在Chrome中,文本文件只是下载 在IE9中,浏览器会询问我是否要打开或保存文件 我要做的是让浏览器自动打开文件(在该文件类型的默认程序中) 代码: 我通过以下途径获得: http://localhost:12345/Services/Foo.asmx/Test?docNum=123456789&docVersion=1 如何让浏览器只打开文件?可能与浏览器配置为打开的文件类型更相关 如果浏览器不知道如何打开某些类型的文件,它将提示您下载

我有一个Web方法,可以创建一个文件并将其提供给浏览器

在Chrome中,文本文件只是下载

在IE9中,浏览器会询问我是否要打开或保存文件

我要做的是让浏览器自动打开文件(在该文件类型的默认程序中)

代码:

我通过以下途径获得:

http://localhost:12345/Services/Foo.asmx/Test?docNum=123456789&docVersion=1


如何让浏览器只打开文件?

可能与浏览器配置为打开的文件类型更相关

如果浏览器不知道如何打开某些类型的文件,它将提示您下载该文件

另一件事是,您已经为TXT文件指定了八位字节流

Content-Type: application/octet-stream
Content-Disposition: attachment;filename=\"My Text File.txt\"
这实际上迫使浏览器下载此处提到的内容


可能与浏览器配置为打开的文件类型更相关

如果浏览器不知道如何打开某些类型的文件,它将提示您下载该文件

另一件事是,您已经为TXT文件指定了八位字节流

Content-Type: application/octet-stream
Content-Disposition: attachment;filename=\"My Text File.txt\"
这实际上迫使浏览器下载此处提到的内容


如果希望浏览器打开jpg、pdf或xls,则需要在“ContentType”标题中指定正确的mime类型。例如,现在您以“八位字节流”的形式输出所有内容,这是非常通用的。浏览器无法猜测哪个程序将打开此类泛型类型。但是,如果是xls,则可以使用“application/vnd.ms excel”的ContentType


这里有一个SO答案,指向查找可能的mime类型的大量资源列表:

如果希望浏览器打开jpg、pdf或xls,则需要在“ContentType”标题中指定正确的mime类型。例如,现在您以“八位字节流”的形式输出所有内容,这是非常通用的。浏览器无法猜测哪个程序将打开此类泛型类型。但是,如果是xls,则可以使用“application/vnd.ms excel”的ContentType


下面是一个SO答案,它指向一个用于查找可能的mime类型的广泛资源列表:

如果客户端计算机知道如何打开文件扩展名,您实际上可以这样做。 我已经让它在IE9中工作了


假设您有一个文件扩展名
.xyz

Pre-Rec:客户端计算机应注册文件扩展名
.xyz
,以打开您希望打开的每个程序。如何在此:

步骤1:在IIS中设置一个新的MIME类型,其属性为文件扩展名=
.xyz
和MIME类型=`application/xyz“如何在此:

第2步:在代码中将MIME类型设置为您刚刚创建的类型,并将内容配置更改为“inline”:


(文件类型
.xyz

        [WebMethod]
        [ScriptMethod(UseHttpGet = true)]
        public void Test(string docNum, string docVersion)
        {
            var response = Context.Response;
            response.ContentType = "application/xyz";
            response.AppendHeader("Content-Disposition", "inline; filename=" + docNum + ".xyz");
            Byte[] stream = System.Text.Encoding.ASCII.GetBytes(docNum + "," + docVersion);
            response.OutputStream.Write(stream, 0, stream.Length);
            response.Flush();
        }

这在IE9中对我有效。

我在Chrome上试用过,但没有效果,它自动下载了文件,尽管我没有在Chrome上玩过任何设置。
如果有人有跨浏览器解决方案,我会感兴趣。

如果客户端计算机知道如何打开文件扩展名,您实际上可以这样做。 我已经让它在IE9中工作了


假设您有一个文件扩展名
.xyz

Pre-Rec:客户端计算机应注册文件扩展名
.xyz
,以便使用每个程序打开。如何在此:

步骤1:在IIS中设置一个新的MIME类型,其属性为文件扩展名=
.xyz
和MIME类型=`application/xyz“如何在此:

第2步:在代码中将MIME类型设置为您刚刚创建的类型,并将内容配置更改为“inline”:


(文件类型
.xyz

        [WebMethod]
        [ScriptMethod(UseHttpGet = true)]
        public void Test(string docNum, string docVersion)
        {
            var response = Context.Response;
            response.ContentType = "application/xyz";
            response.AppendHeader("Content-Disposition", "inline; filename=" + docNum + ".xyz");
            Byte[] stream = System.Text.Encoding.ASCII.GetBytes(docNum + "," + docVersion);
            response.OutputStream.Write(stream, 0, stream.Length);
            response.Flush();
        }

这在IE9中对我有效。

我在Chrome上试用过,但没有效果,它自动下载了文件,尽管我没有在Chrome上玩过任何设置。
如果有人有跨浏览器的解决方案,我会感兴趣。

你不能强制打开外部程序。如果可以,这将是一个巨大的安全风险。@Juhana-同意;但是我不想强制打开外部程序。我正在尝试让浏览器自动打开文件。我们有一些链接可以让浏览器自动写入文件,而不是要求用户选择“打开”或“保存”。是的,您不能这样做。完全取决于浏览器和用户自动打开哪些程序。我们有一个传统的cold fusion服务,它可以做同样的事情,IE不问用户是否应该打开或保存文件。它只是打开它。当我使用t他的服务,IE问我。你能更具体一点关于文件类型吗?我看到你将文件输出为“八进制流”。这是一种非常通用的类型。如果你想让浏览器打开jpg、pdf或xls,你最好使用更具体的mime类型。那么,是什么类型你在输出吗?你不能强制打开一个外部程序。如果你可以的话,这将是一个巨大的安全风险。@Juhana-同意;但是我不是试图强制打开一个外部程序。我试图让浏览器自动打开文件。我们有一些明确的链接,浏览器自动打开文件,而不是asking让用户选择打开或保存。是的,你不能这样做。完全取决于浏览器和用户自动打开哪些程序。我们有一个传统的cold fusion服务,可以做同样的事情,IE不询问用户是否应该打开或保存文件。它只是打开它。当我使用