MvvmCross插件网络和Cookie

时间:2013-05-25 14:35:02

标签: c# xamarin mono mvvmcross portable-class-library

我要做一个需要嵌入式cookie的休息请求。我这样使用System.Net引用

Reference to System.net on PCL and MVVMCross

但是我在VS2012上移植那个PCL库(System.Net)时遇到了问题。该代码在Mac上的Xamarin Studio上运行良好。

提到这个问题我试图以这种方式使用MVVMCross的网络插件:

var url = "http://api.myaddress.com/api";
var json = new Cirrious.MvvmCross.Plugins.Json.MvxJsonConverter();
var client = new Cirrious.MvvmCross.Plugins.Network.Rest.MvxJsonRestClient
{
JsonConverterProvider = () => json
};
var request = new MvxRestRequest(url);
MvxDecodedRestResponse<SearchItem> theResponse = null;
    Exception exception = null;
CookieCollection cc = new CookieCollection ();
cc.Add(new Cookie("mycookiename","mycookievalue","/","api.myaddress.com"));

request.CookieContainer = new CookieContainer();

request.CookieContainer.Add(cc);
client.MakeRequestFor<SearchItem>(request,
                                                    (result) => { theResponse = result; },
                                                (error) => { exception = error; });

我发现此错误“请求的功能未实现。”

  

at /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:553中的System.Net.HttpWebRequest.get_SupportsCookieContainer()[0x00000]     at(wrapper remoting-invoke-with-check)System.Net.HttpWebRequest:get_SupportsCookieContainer()     在/ Users / stuartlodge / Documents / GitHub / Mvx /中的Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestClient.SetCookieContainer(Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestRequest restRequest,System.Net.HttpWebRequest httpRequest)[0x00000] MvvmCross /插件/ Cirrious /网络/ Cirrious.MvvmCross.Plugins.Network /休息/ MvxRestClient.cs:128     位于/ Users / stuartlodge / Documents / GitHub / Mvx / MvvmCross / Plugins / Cirrious / Network的Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestClient.BuildHttpRequest /Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs:100     在Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestClient + c__AnonStorey2。&lt;&gt; m__4()[0x0000d] in /Users/stuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins 。网络/休息/ MvxRestClient.cs:60     在Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestClient.TryCatch(System.Action toTry,System.Action`1 errorAction)[0x00000] / Users / stuartlodge / Documents / GitHub / Mvx / MvvmCross / Plugins / Cirrious / Network / Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs:20

这是适用于Mac的代码,我想使用MvvMCross网络插件移植

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

        // Get response  

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

        }

        SearchItem itemssr = jsonConvert.DeserializeObject<SearchItem>(content);

1 个答案:

答案 0 :(得分:1)

网络插件的特定部分目前正在开发中 - 请参阅GitHub Issue for REST plugin

看起来Cookie功能无法在您正在测试的平台上运行(我猜测它来自堆栈跟踪是xamarin.ios)

在这种情况下,这可能是Xamarin.iOS中的临时问题 - 请参阅:


更常见的是,对于插件开发,功能不起作用,然后编写插件的任何人都必须覆盖该特定平台上的该功能,或者必须在该平台上标记该功能未实现。

请注意,将功能标记为未实现是完全正常的 - 总会有些东西在某些平台上无法实现。

假设可以实现该功能,那么无论谁为网络插件做出贡献,都可以:

如果这不是一个临时的Xamarin.iOS问题,那么我希望有人会在不久的某个时候以这种方式添加cookie支持。如果您希望尽早获得支持,那么:

  • 询问GitHub问题,给贡献者一个用例(有人可能会优先考虑)
  • 自己贡献代码

如果使用这个现有的网络插件是一个太大的初步飞跃,那么可以从查看更简单的插件开始 - 请参阅https://speakerdeck.com/cirrious/plugins-in-mvvmcross

中更简单的Vibrate示例

如果你不想搞乱插件,那么就找一些其他的前进方式 - 例如使用您自己的原生非PCL库来实现该部分功能。


旁注:

  

该代码在Mac上的Xamarin Studio上运行正常。

正如我在另一个问题中尝试解释的那样,目前XS具有“假”PCL支持 - 因此内置XS的PCL只是普通的程序集,并且可移植。