MvvmCross插件网络和Cookie

本文关键字:Cookie 网络 插件 MvvmCross | 更新日期: 2023-09-27 18:15:33

我正在尝试制作一个需要嵌入cookie的休息请求。我已经用System做过了。以那种方式上网参考

System.net在PCL和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; });

我有这个错误"请求的功能未实现。"

在System.Net.HttpWebRequest

。get_SupportsCookieContainer () [0x00000] in/Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:553 .在(wrapper remoting-invoke-with-check)HttpWebRequest: get_SupportsCookieContainer ()在Cirrious.MvvmCross.Plugins.Network.Rest. mvxrestclient . setcookiecontainerMvxRestRequest restRequest, System.Net.HttpWebRequest httpRequest) [0x00000] in/Users/stuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs:128在Cirrious.MvvmCross.Plugins.Network.Rest. mvxrestclient . builddhttprequest (MvxRestRequest restRequest) [0x00028] in/Users/stuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs:100 .使用实例at Cirrious.MvvmCross.Plugins.Network.Rest. mvxrestclient +c__AnonStorey2.<>m__4 () [0x0000d] in/Users/stuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs:60在cirrious . mvxrestclient . plugin . network . rest . mvxrestclient . trycatch (操作尝试,系统。Action ' 1 errorAction) [0x00000] in/Users/stuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/cirious/Network/cirious .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);

MvvmCross插件网络和Cookie

网络插件的特定部分目前正在开发中-参见GitHub的REST插件问题

看起来好像cookie功能不会在你正在测试的平台上工作(我猜从堆栈跟踪是xamarin.ios)

在这种情况下,这可能是由于Xamarin中的临时问题。iOS -见:

  • http://forums.xamarin.com/discussion/comment/14628/Comment_14628

对于插件开发来说,更普遍的情况是,当一个功能不起作用时,无论谁编写插件,都必须在特定的平台上重写该功能,或者必须标记该功能在该平台上未实现。

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

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

  • 实现MvxTouchJsonRestClient某处:https://github.com/slodge/MvvmCross/tree/v3/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network.Touch
    • 这个实现将继承自PCL核心
    • 这个实现必须以某种方式重写SetCookieContainer - https://github.com/slodge/MvvmCross/blob/v3/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs#L126
  • 这个实现将在Plugin.cs文件中为Touch注册IoC - in https://github.com/slodge/MvvmCross/blob/v3/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network.Touch/Plugin.cs#L21

如果这不是一个临时的Xamarin。iOS问题,那么我希望有人很快就会以这种方式添加cookie支持。如果您想要更快的支持,那么:

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

如果使用这个现有的网络插件是一个太大的初始飞跃,那么也许开始看一个更简单的插件-看到更简单的振动的例子https://speakerdeck.com/cirrious/plugins-in-mvvmcross


如果你不想把插件搞得一团糟,那就找一些其他的方式继续前进——例如,为那部分功能使用你自己的本地非pcl库。


注:

这段代码实际上在Mac上的Xamarin Studio上运行良好。

正如我在另一个问题中试图解释的那样,目前XS具有"假"PCL支持-因此XS内置的PCL只是正常的汇编,并且可移植。