Continuing with the last post on authentication issues with wsdl.exe-generated SOAP proxies, you may need to handle HTTP status codes to provide custom exceptions. To do this, the SoapHttpClientProtocol class (actually its parent HttpWebClientProtocol) provides a pair of GetWebResponse() methods for derived classes to override. One method is for synchronous calls and the other for asynchronous.
The following code shows how to generate a custom exception for the HTTP 401 Unauthorized code.
using System;using System.Net; public class MyProxy : WsdlExeGeneratedProxy{ protected override WebRequest GetWebRequest(Uri uri) { HttpWebRequest request = base.GetWebRequest(uri) as HttpWebRequest; request.Headers.Add("accept-language", CultureInfo.CurrentUICulture.Name); request.Credentials = m_state.Credentials; return request; } protected override WebResponse GetWebResponse(WebRequest request) { HttpWebResponse response = base.GetWebResponse(request) as HttpWebResponse; ThrowIfUnauthorized(response); return response; } protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result) { HttpWebResponse response = base.GetWebResponse(request, result) as HttpWebResponse; ThrowIfUnauthorized(response); return response; } private void ThrowIfUnauthorized(HttpWebResponse response) { // There are cases where response can be null (dropped network connection is one). if (response != null && response.StatusCode == HttpStatusCode.Unauthorized) { throw new UnauthorizedException(response); } } internal SomeObject m_state;}
public class UnauthorizedException : ApplicationException{ public UnauthorizedException(HttpWebResponse response) { m_response = response; } internal HttpWebResponse m_response;}