Web サーバーにログインするために必要なセッション ID とキーを取得するために、PCL 内にクラスを作成しました。(応答は XML であり、ログインを実行する 2 番目のメソッドで解析されます) WebServer を制御できないため、クライアント側で問題を解決する必要があります。
これは私のタスクメソッドです:
public static async Task<string> SessionId()
{
HttpWebRequest SessiondIdRequest = (HttpWebRequest)WebRequest.Create(Constants.SessionIdUrl);
SessiondIdRequest.Method = "POST";
SessiondIdRequest.Accept = "application/xml";
SessiondIdRequest.Headers[HttpRequestHeader.AcceptLanguage] = "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3";
SessiondIdRequest.ContentType = "application/x-www-form-urlencoded ";
string appIDviaPOST = "{Here is a String}";
byte[] byteArray = Encoding.UTF8.GetBytes(appIDviaPOST);
using (var SessionIdRequestStream = await Task<Stream>.Factory.FromAsync
(SessiondIdRequest.BeginGetRequestStream, SessiondIdRequest.EndGetRequestStream, SessiondIdRequest))
{
await SessionIdRequestStream.WriteAsync(byteArray, 0, byteArray.Length);
}
WebResponse SessionIdRequestResponse = await Task<WebResponse>.Factory.FromAsync
(SessiondIdRequest.BeginGetResponse, SessiondIdRequest.EndGetResponse, SessiondIdRequest);
var SessionIdRequestResponseStream = SessionIdRequestResponse.GetResponseStream();
var sr = new StreamReader(SessionIdRequestResponseStream);
string SessionIdResult = await sr.ReadToEndAsync();
return SessionIdResult;
}
タスクは WP7 と WP8 で非常にうまく機能します。アプリの Windows 8 部分でこのメソッドを使用すると、まったく異なる結果が得られます。
私は Fiddler を使用して 2 つの違いを見つけました。WP7 と 8 は HTTP 1.0 を使用して UserAgent を送信しているのに対し、Win8 は HTTP 1.1 を使用しており、UserAgent を送信していません。
PCL では、HttpWebRequest に UserAgent と ProtocolVersion のプロパティが含まれていないため、メソッドにそれを強制するように指示することはできません (サブセットのみであるため)。
これを回避する方法はありますか (メソッド全体を Win8 プロジェクトにコピーする以外に、これらのプロパティを設定できます)。
私はMVVMとPCLに非常に慣れていないので、これがばかげた質問であることを少し許してください. ありがとう。