I had a strange problem with my mobile application when we turned on Basic authentication on the http server. W32 version seems to work OK, but the same code ran Windows Mobile 5 with .NET CF throws: WebException
with Status=ServerProtocolViolation
.
Normally when a http server needs authorization, it responds with 401 Unauthorized
then the client re-sends a request with proper Authorization
header. In my case, .NET CF did not understood servers response, claiming that: The server response was not a valid HTTP response
.
Request:
POST /X HTTP/1.1 Content-Type: text/xml User-Agent: X Content-Length: 384 Connection: Keep-Alive Expect: 100-continue Host: 217.X.X.X:Y [...]
Response:
HTTP/1.1 401 Unauthorized Server: X WWW-Authenticate: Basic realm=X Method POST requires a valid user name and password
Here client throws a WebException
with Status=ServerProtocolViolation
.
My solution was to present Authorization
on the first request, since I know it will be needed. Since it solved the problem, I did not investigate strange Expect: 100-continue
header, maybe it was the problem source. Oh and another thing, when server is more forthcoming and returns Connection: close
and Content-Length: X
headers the CF versions also works fine.
Anyway if you would need to create Authorization
header yourself:
public static void SetBasicAuthorization(WebRequest request, string user,string password) {
string authorization = user + ":" + password;
byte[] bytes = Encoding.Default.GetBytes(authorization);
authorization = Convert.ToBase64String(bytes);
request.Headers.Add("Authorization", "Basic " + authorization);
}