Daniel
Daniel

Reputation: 2832

WebRequest.GetResponse() is throwing error 401: Unauthorized

I have an ASP.NET application where I'm trying to output the previously-visited local aspx page to html (its a report and I want to store a static html copy of it as an archive). I store the uri of the local page with:

Session["SummaryURI"] = Request.Url.AbsoluteUri;

and then in the next page I retrieve it with:

string url = Session["SummaryURI"].ToString();

url = url.Replace("static=false", "static=true");
//MessageLabel.Text = url;

//CREATE THE NEW FILE
WebRequest req = WebRequest.Create(url);
WebResponse res = req.GetResponse();

The part req.GetResponse() is where I'm getting my error (401 Unauthorized).

Do I need to configure something in IIS to allow this?

Do I need to edit file permissions or something?

Thanks for your help

By the way this works fine on my local IIS but not on my test server.

Upvotes: 15

Views: 54354

Answers (4)

Andrii Viazovskyi
Andrii Viazovskyi

Reputation: 857

Maybe a proxy bothers you. Look here to see how to disable it: How to remove proxy from WebRequest and leave DefaultWebProxy untouched

Also, maybe you have missing slash at the of your endpoint:

Endpoint = $"https://your.api.com/id=111/"; /* <-- attention to the trailing slash */

Upvotes: 1

Daniel
Daniel

Reputation: 2998

If you cannot enable Anonymous Authentication, try adding this to your WebRequest:

req.UseDefaultCredentials = true;
req.PreAuthenticate = true;
req.Credentials = CredentialCache.DefaultCredentials;

Upvotes: 30

Daniel
Daniel

Reputation: 2832

As of right now I don't have access to the IIS settings so I couldn't enable Anonymous Authentication which is very possible why Cybernate's answer was not working for me. I did find however a simpler method that worked. Instead of using a WebRequest I found that I could do the same thing with Server.Execute. Below is my new solution:

string strHTML = String.Empty;
using (var sw = new StringWriter())
{
    Server.Execute([path-to-local-aspx], sw);
    strHTML = sw.ToString();
}

string relativeReportPath = [relative-path-to-new-html-file];

using (StreamWriter writer = File.CreateText(Server.MapPath(relativeReportPath)))
{
    writer.WriteLine(strHTML);
    MessageLabel.Text = "Your report is ready. Click Close to close the window.";
}

Upvotes: 3

Chandu
Chandu

Reputation: 82943

I think the issue is because authentication on the test IIS server. Two options:

1) Enable "Anonymous Authentication" for the Site on test IIS Server.

2) (Recommended) Before making the request to test server use the code template below with right username/password/domain information that can be authenticated against the test server.

System.Net.NetworkCredential netCredential = 
        new System.Net.NetworkCredential("<USER_NAME>", "<PASSWORD>", "<DOMAIN>");
req.Credentials = netCredential;

Upvotes: 10

Related Questions