关于sharepoint站点中点击word附件弹出用户认证框的解决办法

在sharepoint站点建设中,sharepoint的List有自己的附件添加机制。

不过在实际项目中,可能不用sharepoint自己的附件添加。

而是自己设计一套附件上传添加,比如把附件添加至自己设计的一套文档库

上图的DocLibLink就是自己设计用于存储附件的文档库

这样的话就会有一个问题,就是在IE中访问附件中的word文档的话,IE就会弹出一个用户密码框进行验证。

比如点击某篇文章的附件,

访问诸如http://www.xxx.com.cn/uploadfile/BFA81039-0000-0000-4583-04FB00004C4.doc的这篇文章

在IE中就会出现

按照网上的相关资料,这是因为IE中访问word的话需要向服务器传递用户密码以验证权限,

如果服务器端已经设置了可匿名访问的话,关闭用户密码其实是可以访问相关的附件的。

这样的话中间就多了一个弹出用户密码弹出框的过程。

用户就提出在打开附件时不要弹出用户密码框的要求。

查了一些资料及问了相关这方面的相关人士,解决这个问题可以从两方面入手。

1.可以设置客户端IE设置,

可以在安全设置里面选择anonymous logon,默认的时候是Automatic logon only in Intranet zone

 

这样的话IE打开这个文档时就会以匿名用户访问这个文档,不会再弹出用户验证框。

2.在服务器端写IHttpHandler的处理.

代码
namespace BA.WebClient.WebCommon
{
class FileHandler : IHttpHandler
{
#region IHttpHandler 成员

public bool IsReusable
{
get { return true; }
}

public static byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes,
0, bytes.Length);

// 设置当前流的位置为流的开始
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}

public void ProcessRequest(HttpContext context)
{
HttpResponse Response
= context.Response;
HttpRequest Request
= context.Request;

try
{
string FileName = Request.Path;

SPSite siteColl
= SPContext.Current.Site;
SPWeb site
= SPContext.Current.Web;

SPSecurity.RunWithElevatedPrivileges(
delegate()
{
using (SPSite ElevatedsiteColl = new SPSite(siteColl.ID))
{
using (SPWeb web = ElevatedsiteColl.OpenWeb(site.ID))
{
SPFile file
= web.GetFile(FileName);
string FullFileName = HttpContext.Current.Server.MapPath(FileName);

FileInfo DownloadFile
= new FileInfo(FullFileName);
if (file.Exists)
{
System.IO.Stream sourceStream
= file.OpenBinaryStream();
byte[] buffer = new byte[1024];
buffer
= StreamToBytes(sourceStream);

Response.Clear();
Response.ClearHeaders();
Response.Buffer
= false;
Response.ContentType
= "application/octet-stream";
Response.AppendHeader(
"Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(web.Url + file.ServerRelativeUrl, System.Text.Encoding.ASCII));
Response.AppendHeader(
"Content-Length", file.Length.ToString());
Response.OutputStream.Write(buffer,
0, buffer.Length);
Response.Flush();
Response.End();
}
else if (DownloadFile.Exists)
{
Response.Clear();
Response.ClearHeaders();
Response.Buffer
= false;
Response.ContentType
= "application/octet-stream";
Response.AppendHeader(
"Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.ASCII));
Response.AppendHeader(
"Content-Length", DownloadFile.Length.ToString());
Response.WriteFile(DownloadFile.FullName);
Response.Flush();
Response.End();
}
else
{
//文件不存在
}
}
}
});
}
catch (Exception ex)
{
//打开时异常了
throw ex;
}
}

#endregion
}
}

然后在网站的web.config加入代码

<add verb="GET" path="*.doc" type="BA.WebClient.WebCommon.FileHandler, BA.WebClient.WebCommon"/>

让所有对doc文档的处理方式都以上述代码方式处理。

其实上述代码的意思就是说把doc文档写入到文件流中,然后输出此文件流,从而避免了在IE中直接打开doc文档,

从而就免去了IE验证的步骤。

 

posted @ 2010-09-15 16:55  poisson_notes  阅读(1238)  评论(0编辑  收藏  举报