Сеть плагинов MvvmCross и файлы cookie

Я пытаюсь сделать запрос на отдых, для которого требуется встроенный файл cookie. Я сделал это, используя ссылку System.Net таким образом.

Ссылка на System.net на PCL и MVVMCross

но у меня проблема с переносом этой библиотеки PCL (System.Net) на VS2012. Этот код отлично работает в Xamarin Studio на Mac.

Ссылаясь на этот вопрос, я пытался использовать сетевой плагин 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 System.Net.HttpWebRequest.get_SupportsCookieContainer () [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System/System.Net/HttpWebRequest.cs:553 at (оболочка удаленного вызова-с-проверкой) System .Net.HttpWebRequest:get_SupportsCookieContainer() at Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestClient.SetCookieContainer (Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestRequest restRequest, System.Net.HttpWebRequest httpRequest) [0x00000] в /Users/ stuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs:128 в Cirrious.MvvmCross.Plugins.Network.Rest.MvxRestClient.BuildHttpRequest (Cirrious.MvvmCross Plugins.Network.Rest.MvxRestRequest restRequest) [0x00028] в /Users/stuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest/MvxRestClient.cs:100 в Cirrious. MvvmCross.Plugins.Network.Rest.MvxRestClient+c__AnonStorey2.‹>m__4 () [0x0000d] в /Users/s tuartlodge/Documents/GitHub/Mvx/MvvmCross/Plugins/Cirrious/Network/Cirrious.MvvmCross.Plugins.Network/Rest/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);

person Luigi Saggese    schedule 25.05.2013    source источник
comment
Одна побочная проблема - вызов var client = new Cirrious.MvvmCross.Plugins.Network.Rest.MvxJsonRestClient не переносим - вместо этого используйте IoC - например. Mvx.Resolve<IMvxJsonRestClient>() - таким образом вы можете получить различную реализацию на разных платформах, если вам это нужно.   -  person Stuart    schedule 25.05.2013


Ответы (1)


Эта конкретная часть подключаемого модуля Network в настоящее время находится в стадии разработки — см. проблема GitHub для подключаемого модуля REST.

Похоже, что функция cookie не будет работать на платформе, которую вы тестируете (которая, как я предполагаю, из трассировки стека - это xamarin.ios)

В этом случае это может быть связано с временными проблемами в Xamarin.iOS — см.:


В более общем случае для разработки плагинов, где функция не работает, тот, кто пишет плагин, должен будет либо переопределить эту функцию на этой конкретной платформе, либо отметить, что эта функция не реализована на этой платформе.

Обратите внимание, что отмечать функции как нереализованные совершенно нормально — всегда есть что-то, что не будет реализовано на некоторых платформах.

Предполагая, что эта функция может быть реализована, любой, кто вносит свой вклад в сетевой плагин, может:

Если это не временная проблема Xamarin.iOS, то я ожидаю, что кто-то скоро добавит поддержку файлов cookie таким образом. Если вы хотите получить эту поддержку раньше, то:

  • спросите о проблеме GitHub, предоставив участникам пример использования (кто-то может отдать ему приоритет)
  • внести код самостоятельно

Если работа с этим существующим сетевым плагином слишком велика для начала, то, возможно, стоит начать с поиска более простого плагина — см. гораздо более простой пример вибрации в https://speakerdeck.com/cirrious/plugins-in-mvvmcross


Если вы не хотите возиться с плагинами, просто найдите другой способ двигаться вперед - например. используя свою собственную не-PCL библиотеку для этой части функциональности.


Примечание:

Этот код отлично работает в Xamarin Studio на Mac.

Как я пытался объяснить в другом вопросе, в настоящее время XS имеет «фальшивую» поддержку PCL, поэтому PCL, встроенные в XS, являются обычными сборками и не переносимы.

person Stuart    schedule 25.05.2013