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);
网络插件的特定部分目前正在开发中-参见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只是正常的汇编,并且不可移植。