Xamarin上的WebHeaderCollection和HttpWebRequest

Lui*_*ese 1 c# mono httpwebrequest xamarin xamarin-studio

我正在尝试将我的项目从Mac上的Xamarin Studio移植到Windows 7上的Visual Studio 2012.在Mac和XS上工作正常.在VisualStudio 2012上,我遇到了以下两个问题:

错误3'System.Net.WebHeaderCollection'不包含'Add'的定义,并且没有扩展方法'Add'接受类型'System.Net.WebHeaderCollection'的第一个参数可以找到(你是否缺少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();
    }
Run Code Online (Sandbox Code Playgroud)

我怎么能解决它?

Aga*_*gat 6

没有实现的迄今为止你所提到的事情.但那没关系.他们仍然做得很好!

回答你的问题.

错误3.是的.目前,您只能使用Headers ["key"] = value.但.不是每个标题.我试图将" Content-Length " 放在那里(因为没有实现"ContentLength"属性),但得到了"限制标题"异常.但是,请求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);
    }
Run Code Online (Sandbox Code Playgroud)