2

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に非常に慣れていないので、これがばかげた質問であることを少し許してください. ありがとう。

4

3 に答える 3

0

信じられないかもしれませんが、PCL を使用している場合、UserAgent ヘッダーを変更することはできません。

このスレッドのコメントを読んでください。

Microsoft によって 2013 年 2 月 25 日午後 4 時 5 分に投稿されました。

残念ながら、ポータブル ライブラリの設計は、グローバルに利用可能なプロパティのみをサポートするようになっており、ユーザー エージェントをすべてのプラットフォーム (SilverLight など) で設定することはできません

残念ながら、制限されたヘッダーのほとんどは PCL ではないため、ほとんどのプラットフォームでは変更できません。

このスレッドで見たように、これらの制限付きヘッダーを変更する唯一の方法は、リフレクションを使用することです。

var httpRequest = (HttpWebRequest) WebRequest.Create(uri);

var userAgent = httpRequest.GetType().GetProperty("UserAgent");
if(null != userAgent) 
{
    userAgent.SetValue(httpRequest, "Your value", null);
}

ただし、一部のプラットフォームでは機能する場合でも、他の一部のプラットフォームでは次のようなエラーが発生するため、これは理想とはほど遠いものです。

System.InvalidOperationException: API System.Net.HttpWebRequest.set_UserAgent(System.String)' は現在のプラットフォームでは使用できません。(この投稿を参照)

プロジェクトがサポートされているプラ​​ットフォームと一致する場合、 ThumbGen の回答は別の選択肢になる可能性がありますが、まだ試していません。

于 2013-12-31T14:38:19.757 に答える
-1

User-Agent プロパティが見つからない場合は、user-agent ヘッダーの設定を試すことができます。

SessiondIdRequest.Headers["User-Agent"] = @"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)";

提供されたプロパティを使用する代わりに、リクエスト ヘッダーの作成を試みることもできます。

Key              Value
Request          POST http://localhost/index.aspx HTTP/1.0
Content-Length  *length*
于 2013-03-25T05:33:26.657 に答える