1

Mac の Xamarin Studio から Windows 7 の Visual Studio 2012 にプロジェクトを移植しようとしています。Mac と XS ではすべて正常に動作します。VisualStudio 2012 では、次の 2 つの問題があります。

エラー 3 'System.Net.WebHeaderCollection' には 'Add' の定義が含まれておらず、タイプ 'System.Net.WebHeaderCollection' の最初の引数を受け入れる拡張メソッド 'Add' が見つかりませんでした (using ディレクティブまたはアセンブリ参照?) C:\Users\user\Documents\Visual Studio 2012\Projects\MyProject\MyProject.Core\Services\MyProjectService.cs

エラー 4 'System.Net.HttpWebRequest' には 'GetResponse' の定義が含まれておらず、'System.Net.HttpWebRequest' 型の最初の引数を受け入れる拡張メソッド 'GetResponse' が見つかりませんでした (using ディレクティブまたはアセンブリ参照?) C:\Users\user\Documents\Visual Studio 2012\Projects\MyProject\MyProject.Core\Services\MyProjectService.cs

そのコードで:

    var request = WebRequest.Create("https://www.myaddress.com/test/") as HttpWebRequest;
    request.Method = "GET";
    request.Accept = "application/json";
    request.Headers.Add(HttpRequestHeader.Cookie,"mycookievalue");

    // Get response  
    using (var response = request.GetResponse() as HttpWebResponse)
    {
        // Get the response stream  
        var reader = new StreamReader(response.GetResponseStream());
        content = reader.ReadToEnd();
    }

どうすれば解決できますか?

4

2 に答える 2

6

これまでのところ、あなたが言及したことの実装はありません。しかし、それは大丈夫です。彼らは今でも素晴らしい仕事をしています!

ご質問にお答えします。

エラー 3。はい。現在、Headers["key"] = value のみを使用できます。しかし。すべてのヘッダーではありません。そこに「 Content-Length 」を配置しようとしましたが(「 ContentLength 」プロパティも実装されていないため)、「制限付きヘッダー」例外が発生しました。しかし、Request POSTが正常に処理されたので、手放しました。

エラー 4。はい。そのような方法はありません。(同じように、「GetRequestStream」がないため (たとえば、POST データを要求ストリームに書き込みたい場合))。良いニュースは、BeginGetResponse とBeginGetRequestStreamがそれぞれあり、C#のアクション メソッドがすべてのキッチンを簡素化することです。

(さらに、これは非同期プラクティスの一般的な理解に非常に役立ちます)。

基本的なサンプルは、Microsoft の公式ドキュメントにあります。

しかし、アクションでそれを行うには、次を使用しました。

    public void MakeRequest(string url, string verb, Dictionary<string, string> requestParams,
        Action<string> onSuccess, Action<Exception> onError)
    {
        string paramsFormatted;

        if (verb == "GET")
        {
            paramsFormatted = string.Join("&", requestParams.Select(x => x.Key + "=" + Uri.EscapeDataString(x.Value)));
            url = url + (string.IsNullOrEmpty(paramsFormatted) ? "" : "?" + paramsFormatted);
        }
        else
        {
            // I don't escape parameters here,
            // as Uri.EscapeDataString would throw exception if the parameter length
            // is too long, so you must control that manually before passing them here
            // for instance to convert to base64 safely
            paramsFormatted = string.Join("&", requestParams.Select(x => x.Key + "=" + (x.Value)));
        }

        var request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = verb;

        requestParams = requestParams ?? new Dictionary<string, string>();

        Action goRequest = () => MakeRequest(request, 
            response =>
            {
                onSuccess(response);
            },
            error =>
            {
                if (onError != null)
                {
                    onError(error);
                }
            });

        if (request.Method == "POST")
        {
            request.BeginGetRequestStream(ar =>
            {
                using (Stream postStream = request.EndGetRequestStream(ar))
                {
                    byte[] byteArray = Encoding.UTF8.GetBytes(paramsFormatted);
                    postStream.Write(byteArray, 0, paramsFormatted.Length);
                }
                goRequest();
            }, request);
        }
        else // GET
        {
            goRequest();
        }
    }

    private void MakeRequest(HttpWebRequest request, Action<string> onSuccess, Action<Exception> onError)
    {
        request.BeginGetResponse(token =>
        {
            try
            {
                using (var response = request.EndGetResponse(token))
                {
                    using (var stream = response.GetResponseStream())
                    {
                        var reader = new StreamReader(stream);
                        onSuccess(reader.ReadToEnd());
                    }
                }
            }
            catch (WebException ex)
            {
                onError(ex);
            }
        }, null);
    }
于 2013-06-24T01:51:32.493 に答える
1

エラー 4 に答えるために、2 つの拡張メソッドを作成して、WebRequest クラスに GetRespone() メソッドと GetRequestStream() メソッドを配置し、元のバージョンと同じように機能するようにしました。つまり、スレッドをブロックしました。だからここにあります:

public static class ExtensionMethods
{
    public static WebResponse GetResponse(this WebRequest request){
        ManualResetEvent evt = new ManualResetEvent (false);
        WebResponse response = null;
        request.BeginGetResponse ((IAsyncResult ar) => {
            response = request.EndGetResponse(ar);
            evt.Set();
        }, null);
        evt.WaitOne ();
        return response as WebResponse;
    }

    public static Stream GetRequestStream(this WebRequest request){
        ManualResetEvent evt = new ManualResetEvent (false);
        Stream requestStream = null;
        request.BeginGetRequestStream ((IAsyncResult ar) => {
            requestStream = request.EndGetRequestStream(ar);
            evt.Set();
        }, null);
        evt.WaitOne ();
        return requestStream;
    }
}

これを通常のコードとは異なる名前空間に配置し、その名前空間をインポートするようにしてください。次に、WebRequest インスタンスの GetResponse() メソッドがあります。ああ、POST データの送信に役立つ GetRequestStream() も

于 2014-02-06T15:00:40.223 に答える