WebClient DownloadFile access denied

3.7k Views Asked by At

I'm trying to download the file to the server, but instead data is written to the error. Please tell me what is wrong. When i use this code on "http://localhost:xxx" everything is working fine. WebClient myWebClient = new WebClient(); myWebClient.DownloadFile(remoteUri, Server.MapPath("~/test/" + "test.xml"));

I updated my question. Here is my full code:

string path1 = "certificate1.p12";
string path2 = "certificate2.crt";
X509Certificate2 cert1 = new X509Certificate2(Server.MapPath(("~/test/") + path1), "", X509KeyStorageFlags.MachineKeySet);
X509Certificate2 cert2 = new X509Certificate2(Server.MapPath(("~/tets/") + path2));
CertificateWebClient2 myWebClient = new CertificateWebClient2(cert1, cert2);
string remoteUri = "https://xxxxx";
string path = "test.xml";
myWebClient.UseDefaultCredentials = true;
myWebClient.DownloadFile(remoteUri, Server.MapPath((@"~/Files/") + path));


public class CertificateWebClient : WebClient
{
    private readonly X509Certificate2 certificate1;
    private readonly X509Certificate2 certificate2;

    public CertificateWebClient(X509Certificate2 cert1, X509Certificate2 cert2)
    {
        certificate1 = cert1;
        certificate2 = cert2;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
        System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate X509certificate, X509Chain chain, System.Net.Security.SslPolicyErrors errors)
        {
            return true;
        };

        request.ProtocolVersion = HttpVersion.Version10;
        request.Method = "Post";
        request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UseDefaultCredentials = true;
        request.ContentLength = 0;
        request.ClientCertificates.Add(certificate1);
        request.ClientCertificates.Add(certificate2);
        return request;
    }
}
3

There are 3 best solutions below

0
On

I suppose you are not using credentials. When you load with the browser it is automatically appending it, but not the webclient.

So you need to use default credentials. https://msdn.microsoft.com/en-us/library/system.net.webclient.usedefaultcredentials(v=vs.110).aspx

But the web server should use the proper user.

0
On

Try with default credentials.

WebClient myWebClient = new WebClient { UseDefaultCredentials = true };
myWebClient.DownloadFile(remoteUri, Server.MapPath("~/test/" + "test.xml"));
1
On

Check whether the download is blocked by your proxy server. If so, use the following code:

using (var webClient = new WebClient())
{
    //  Obtain the 'Proxy' of the  Default browser.
    IWebProxy webProxy = webClient.Proxy;

    if (webProxy != null)
    {
        // Use the default credentials of the logged on user.
        webProxy.Credentials = CredentialCache.DefaultCredentials;
    }

   // Do stuff
}