使用WebClient获取Intranet文件

时间:2016-11-22 10:46:28

标签: asp.net asp.net-mvc webclient windows-authentication

在我的公司内部网中有一个服务器,负责存储文件。最初,服务器必须仅在Intranet环境中运行,但现在需要与外部Web应用程序共享文件。无法从Internet访问此服务器。

我想创建一个ASP.NET MVC解决方案,该解决方案使用WebClient从Intranet服务器获取这些文件,并通过外部应用程序的FileResult将它们发送回用户。将为此客户端提供自定义域用户凭据。到目前为止,我尝试创建一个CredentialCache类,设置正确的凭据并将其附加到WebClients Credentials属性,如下面的代码所示:

public ActionResult Download(int id, string fileName)
{
    var fileService = new FilesService();
    var documentUrl = fileService.GetUrlFileByFileId(id);
    string filePath = "http://my.intranet.com/" + documentUrl;
    var fileNameFromUrl = filePath.Substring(filePath.LastIndexOf("\\") + 1);
    byte[] filedata;

    CredentialCache cc = new CredentialCache();
    cc.Add(new Uri("http://my.intranet.com/"),
       "ntlm",
        new NetworkCredential("myUserName", "myPassword", "myDomain"));

    using (var client = new WebClient())
    {
        client.Credentials = cc;
        filedata = client.DownloadData(filePath);
    }

    string contentType = MimeMapping.GetMimeMapping(filePath);

    var cd = new ContentDisposition
    {
        FileName = fileName,
        Inline = false
    };

    Response.AppendHeader("Content-Disposition", cd.ToString());

    return File(filedata, contentType);
}

根据Domain credentials for a WebClient class don't work中发布的问题,它应该有效,但事实并非如此。它只在我在localhost上运行问题时运行,但是当我在测试服务器上发布我的解决方案时,它返回401错误。我的问题是如何让这个工作?是否可以通过此方法下载文件?

更新---我已经在另一台服务器上发布了我的测试应用程序,它开始工作了。现在测试应用程序位于另一台服务器上,而不是存储文件的服务器。当两者都在同一台机器上时,为什么它不起作用的任何想法?

2 个答案:

答案 0 :(得分:0)

401错误未经授权,因此问题可能与权限有关。您确定用于登录该文件夹的用户帐户是否具有正确的访问权限?

答案 1 :(得分:0)

好的,我在这个网站上找到了解决方案:https://blogs.msdn.microsoft.com/distributedservices/2009/11/10/wcf-calling-wcf-service-hosted-in-iis-on-the-same-machine-as-client-throws-authentication-error/

解决方案是添加一个注册表项并将我的Web应用程序添加到此条目以允许返回连接。