So I originally had this code for the web request:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.UseDefaultCredentials = true;
WebResponse response = request.GetResponse();
which I changed to this in order to add unit tests:
IHttpWebRequest request = IHttpWebRequestFactory.Create(uri);
request.UseDefaultCredentials = true;
IWebResponse response = request.GetResponse();
IHttpWebRequest:
public interface IHttpWebRequest
{
bool UseDefaultCredentials { get; set; }
IWebResponse GetResponse();
}
MyHttpWebRequest:
public class MyHttpWebRequest : IHttpWebRequest
{
private readonly HttpWebRequest httpWebRequest;
private bool useDefaultCredentials;
public MyHttpWebRequest(HttpWebRequest httpWebRequest)
{
this.httpWebRequest = httpWebRequest;
}
public bool UseDefaultCredentials
{
get { return useDefaultCredentials; }
set { useDefaultCredentials = value; }
}
public IWebResponse GetResponse()
{
return new MyWebResponse((HttpWebResponse)httpWebRequest.GetResponse());
}
}
IHttpWebRequestFactory:
public interface IHttpWebRequestFactory
{
IHttpWebRequest Create(string Uri);
}
HttpWebRequestFactory:
public class HttpWebRequestFactory : IHttpWebRequestFactory
{
public IHttpWebRequest Create(string Uri)
{
return new MyHttpWebRequest((HttpWebRequest)WebRequest.Create(Uri));
}
}
IWebResponse:
public interface IWebResponse
{
Stream GetResponseStream();
}
MyWebResponse:
public class MyWebResponse : IWebResponse
{
private WebResponse webResponse;
public MyWebResponse(HttpWebResponse webResponse)
{
this.webResponse = webResponse;
}
public Stream GetResponseStream()
{
return webResponse.GetResponseStream();
}
}
But the website now returns a HTTP Error 401 Unauthorized. Using Fiddler works though. I also tried setting request.Credentials = CredentialCache.DefaultNetworkCredentials
, request.PreAuthenticate = true
, etc. but to no avail. :(
I also tried supplying my username and password to Credentials but the unauthorized error still appears, which is odd since the original code above works. :(
You are not using useDefaultCredentials
correctly, try this:
MyHttpWebRequest:
public class MyHttpWebRequest : IHttpWebRequest
{
private readonly HttpWebRequest httpWebRequest;
public MyHttpWebRequest(HttpWebRequest httpWebRequest)
{
this.httpWebRequest = httpWebRequest;
}
public bool UseDefaultCredentials
{
get { return this.httpWebRequest.UseDefaultCredentials; }
set { this.httpWebRequest.UseDefaultCredentials = value; }
}
public IWebResponse GetResponse()
{
return new MyWebResponse((HttpWebResponse)httpWebRequest.GetResponse());
}
}