Заставить этот код клиента WCF работать на Mono и MonoTouch на Mac? - PullRequest
0 голосов
/ 12 июля 2011

Я пытаюсь заставить следующий фрагмент кода работать в консольном приложении Mono и в качестве конечной цели в приложении MonoTouch. Код отлично работает под VS2008 с помощью консольного приложения Windows. Когда я запускаю его как консольное приложение Mono на Mac, я получаю

Необработанное исключение: System.NotImplementedException: запрошенное Функция не реализована. в System.ServiceModel.Channels.SecurityBindingElement.CanBuildChannelFactory [IDuplexChannel] (System.ServiceModel.Channels.BindingContext context) [0x00000] в : 0

В MonoTouch я получаю эту ошибку:

Необработанное исключение: System.ServiceModel.FaultException: ошибка произошла при проверке безопасности сообщения. в System.ServiceModel.MonoInternal.ClientRuntimeChannel.Request (System.ServiceModel.Description.OperationDescription od, Параметры System.Object []) [0x00188] в /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:545

Может кто-нибудь объяснить, что не так? Для простоты не требуется app.config.

using System;
using MonoAPI3.BLAPI3Session;
using Brainloop.ServiceLibrary.DataModel;
using System.ComponentModel;
using System.ServiceModel;

public static void Main()
{
System.Net.ServicePointManager.ServerCertificateValidationCallback += (se, cert, chain, sslerror) => { return true; };

var oClient = new SessionServiceClient( new BasicHttpBinding( BasicHttpSecurityMode.TransportWithMessageCredential )
            {
                CloseTimeout = new TimeSpan( 0, 0, 10 ),
                OpenTimeout = new TimeSpan( 0, 1, 0 ),
                ReceiveTimeout = new TimeSpan( 0, 1, 0 ),
                SendTimeout = new TimeSpan( 0, 1, 0 ),
                AllowCookies = false,
                BypassProxyOnLocal = false,
                HostNameComparisonMode = HostNameComparisonMode.StrongWildcard,
                MaxBufferSize = 65536,
                MaxBufferPoolSize = 524288,
                MaxReceivedMessageSize = 65536,
                MessageEncoding = WSMessageEncoding.Text,
                TextEncoding = System.Text.Encoding.UTF8,
                TransferMode = TransferMode.Buffered,
                UseDefaultWebProxy = true,
                ReaderQuotas = new System.Xml.XmlDictionaryReaderQuotas()
                {
                    MaxDepth = 32,
                    MaxStringContentLength = 8192,
                    MaxArrayLength = 16384,
                    MaxBytesPerRead = 4096,
                    MaxNameTableCharCount = 16384
                }

            },
            new EndpointAddress( "https://service.myserver.com/Service/V3/Session.svc" ) );

            oClient.ClientCredentials.UserName.UserName = "user@domain.com";
            oClient.ClientCredentials.UserName.Password = "pwd";

            SessionInfo oInfo = oClient.StartSession();

            Console.WriteLine( "SESSION HASH: " + oInfo.SessionHash );
}

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Проблемная строка кода:

BasicHttpSecurityMode.TransportWithMessageCredential

Mono не поддерживает WS-Security.В основном есть много опций на BasicHttpSecurityMode, которые не будут работать.Если вам требуются учетные данные сообщения, то, боюсь, этот код не сможет работать.Вот ссылка по теме:

http://lists.ximian.com/pipermail/mono-bugs/2010-January/096972.html

0 голосов
/ 13 июля 2011

Рекомендую скачать вложение с по этой ссылке .

Мне удалось заставить его работать. Я установил веб-проект на компьютере Windows в IIS 7 с включенной только базовой аутентификацией и .NET-авторизацией для конкретного пользователя . Затем я просто запускаю консольное приложение под MonoDevelop на своем компьютере Mac, и оно работает без ошибок.

Единственное отличие, которое я вижу между консольным приложением Mono и приложением MonoTouch, заключается в следующей строке:

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

В приложении MonoTouch свойство binding.Security.Transport не создается.

...