使这个WCF客户端代码在Mac上的Mono和MonoTouch上运行?

时间:2011-07-12 15:43:18

标签: wcf mono xamarin.ios

我正在尝试将以下代码片段用于Mono控制台应用程序,并作为MonoTouch应用程序的最终目标。使用Windows控制台应用程序,代码在VS2008下运行正常。 当它在Mac上作为Mono控制台应用程序运行时,我得到了

  

未处理的异常:System.NotImplementedException:请求的   功能未实现。在   System.ServiceModel.Channels.SecurityBindingElement.CanBuildChannelFactory [IDuplexChannel]   (System.ServiceModel.Channels.BindingContext context)[0x00000] in   :0

在MonoTouch中,我收到此错误:

  

未处理的异常:System.ServiceModel.FaultException:错误   验证邮件的安全性时发生。在   System.ServiceModel.MonoInternal.ClientRuntimeChannel.Request   (System.ServiceModel.Description.OperationDescription od,   System.Object []参数)[0x00188] in   /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 个答案:

答案 0 :(得分:2)

问题的代码行是:

BasicHttpSecurityMode.TransportWithMessageCredential

Mono不支持WS-Security。基本上,BasicHttpSecurityMode上有很多选项无法使用。如果您需要Message Credentials,那么我担心这些代码无法正常工作。这是一个相关链接:

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

答案 1 :(得分:0)

我建议您从this link下载附件。

我成功地让它发挥作用。我在 IIS 7 下的Windows计算机上将Web项目设置为基本身份验证 .NET授权设置为特定用户。 然后我就在我的Mac机器上运行MonoDevelop下的控制台应用程序,它没有任何错误。

我可以在Mono控制台应用程序和MonoTouch应用程序之间看到的唯一区别是这一行:

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

在MonoTouch应用程序中,不会生成binding.Security.Transport属性。