无法下载文件

时间:2010-09-14 01:22:09

标签: c# .net download

我正在尝试从C#应用程序下载文件。我尝试了两种不同的方法,但两者都产生相同的响应: “远程服务器返回错误:(401)未经授权。”

我很确定这是凭证问题(因为401)。如果我从浏览器导航到该URL并输入所提供的相同凭据,则该文件下载得很好。在“尝试2”(下面)中,对于authtype,我尝试过: NTLM,Basic,Negotiate和Digest没有任何运气。

有谁看到我在这里做错了什么?

感谢您的帮助!

尝试1:

string username = "username";
string password = "password";
string domain = "domain";
string url = @"http://LiveLinkInstance.com/livelink/llisapi.dll/999999/WordDocument.docx?func=doc.Fetch&nodeid=999999&ReadOnly=True&VerNum=-2&nexturl=/livelink/llisapi.dll?func=ll&objId=888888&objAction=browse&viewType=1";  

// Create an instance of WebClient
WebClient client = new WebClient();
client.Proxy = null;

client.Credentials = new System.Net.NetworkCredential(username, password, domain);

client.DownloadFile(new Uri(url), @"C:\FileDownloads\test.txt");

尝试2:

string username = "username";
string password = "password";
string domain = "domain";
string url = @"http://LiveLinkInstance.com/livelink/llisapi.dll/999999/WordDocument.docx?func=doc.Fetch&nodeid=999999&ReadOnly=True&VerNum=-2&nexturl=/livelink/llisapi.dll?func=ll&objId=888888&objAction=browse&viewType=1";

HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(domain + "\\" + username + ":" + password));
wr.Headers.Add("Authorization", "Basic " + credentials);

CredentialCache cc = new CredentialCache();
cc.Add(new Uri(url), "NTLM", new NetworkCredential(username, password, domain));
wr.Credentials = cc;
Stream str = ws.GetResponseStream();

3 个答案:

答案 0 :(得分:1)

正如Amitay所说,使用fiddler来比较来自浏览器的流量是最好的方法。顺便说一句,看看here就是这样 - OP的情况是,请求被重定向到不同的位置,但凭证没有被重新传递。所以OP做了手动重定向来解决问题。

答案 1 :(得分:1)

你试过吗

client.UseDefaultCredentials = true 

如果您使用的是MVC或WebApi,则应使用

修饰您的方法
[Authorize]

如果您能够模仿用户,请像这样使用

 WindowsIdentity wi = null;
 wi = (WindowsIdentity)HttpContext.Current.User.Identity;

 using (wi.Impersonate())
       {
         var client = new WebClient { UseDefaultCredentials = true };

         client.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
            var result = JsonConvert.DeserializeObject<Object>(Encoding.UTF8.GetString(client.DownloadData("http://api.com/api/values")));

         return Request.CreateResponse(result);
       }

答案 2 :(得分:0)

我看到LL使用自己的基于表单的身份验证或基于IWA的SSO。我不知道你是否可以使用其他HTTP身份验证类型。

如果您的服务器使用(默认)表单身份验证,则必须使用LAPI或WS下载文档,以提供LAPI / WS调用中的LL凭据。您也可以通过LAPI / WS获取用于HTTP通信的cookie。

如果已配置SSO,则可以将凭据设置为CredentialCache.DefaultCredentials以传入当前已验证的Windows会话的凭据。