快速背景资料: 有一个使用BasicHttpBinding的身份验证的wcf。 Dataservice.cs包含基于服务元数据的dataservice客户端(使用svcutil生成)。
我首先使用代码创建了一个控制台应用程序,它完美地工作,然后我制作了一个xamarin android项目。我复制了代码。引用了system.runtime.serialization和system.servicemodel。这给了我一个方法或操作没有实现错误。
主要代码:
base.OnCreate(bundle);
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
EndpointAddress address = new EndpointAddress("https://serviceurl/service1.svc");
PermissiveCertificatePolicy.Enact("CN=MySelfSignedCert");
var client = new DataServiceClient(binding, address);
client.ClientCredentials.UserName.UserName = "Username";
client.ClientCredentials.UserName.Password = "Passord";
try
{
var projects = client.GetDataTest(1);
}
catch (Exception ex)
{
var error = ex.Message;
}
我是Xamarin编程的新手,所以我可能在这里缺少关键点,但请记住,这可以作为控制台应用程序,服务在线(不是localhost)。
Unhandled Exception:
System.NotImplementedException:未实现方法或操作。
07-20 11:35:39.704 D / Mono(1452):DllImport试图加载:' /system/lib/liblog.so'。 07-20 11:35:39.704 D / Mono(1452):DllImport加载库' /system/lib/liblog.so'。 07-20:35:39.704 D / Mono(1452):DllImport搜索:' /system/lib/liblog.so' (' /system/lib/liblog.so')。 07-20 11:35:39.704 D / Mono(1452):搜索' __ android_log_print'。 07-20 11:35:39.704 D / Mono(1452):探索' __ android_log_print'。 07-20 11:35:39.704 D / Mono(1452):发现为' __ android_log_print'。 07-20 11:35:39.708 I / MonoDroid(1452):未处理的异常: 07-20 11:35:39.708 I / MonoDroid(1452):System.NotImplementedException:未实现方法或操作。 07-20 11:35:39.708 I / MonoDroid(1452):在中的System.ServiceModel.BasicHttpBinding.CreateSecurityBindingElement()[0x00025]/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/BasicHttpBinding_4_5.cs:125 07-20 11:35:39.708 I / MonoDroid(1452):在
中的System.ServiceModel.BasicHttpBinding.CreateBindingElements()[0x00006]/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/BasicHttpBinding_4_5.cs:98 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.Channels.CustomBinding..ctor(System.ServiceModel.Channels.Binding binding)[0x00000] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Channels/CustomBinding.cs:60 07-20 11:35:39.708 I / MonoDroid(1452):at System.ServiceModel.Channels.Binding.CreateContext(System.ServiceModel.Channels.BindingParameterCollection parameters)[0x00000] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Channels/Binding.cs:96 07-20 11:35:39.708 I / MonoDroid(1452):at System.ServiceModel.Channels.Binding.CanBuildChannelFactory [TChannel](System.ServiceModel.Channels.BindingParameterCollection parameters)[0x00011] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Channels/Binding.cs:267 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.ChannelFactory.CreateFactory()[0x000ad] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ChannelFactory.cs:199 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.ChannelFactory.OnOpening()[0x00006] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ChannelFactory.cs:383 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.Channels.CommunicationObject.ProcessOpening()[0x00017]中
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Channels/CommunicationObject.cs:276 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)[0x00000] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Channels/CommunicationObject.cs:169 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.Channels.CommunicationObject.Open()[0x00000]中
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Channels/CommunicationObject.cs:164 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.ChannelFactory.EnsureOpened()[0x00058] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ChannelFactory.cs:297 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.ChannelFactory`1 [TChannel] .CreateChannel()[0x00000] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ChannelFactory_1.cs:108 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.ClientBase`1 [TChannel] .CreateChannel()[0x00000] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientBase.cs:266 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.ClientBase`1 [TChannel] .get_InnerChannel()[0x0000b] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientBase.cs:186 07-20 11:35:39.708 I / MonoDroid(1452):在System.ServiceModel.ClientBase`1 [TChannel] .get_Channel()[0x00000] in
/Users/builder/data/lanes/2923/52635947/source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientBase.cs:192 07-20 11:35:39.708 I / MonoDroid(1452):位于C:\ Users \ username \ documents \ visual studio 2015 \ Projects \ somethingMobileApp
中的DataServiceClient.GetProjects(Int32 firmaid)[0x00001]\ somethingMobileAppAndroid \ DataService.cs:10752 07-20 11:35:39.708 I / MonoDroid(1452):在C:\ Users \ username \ documents \ visual studio 2015 \ Projects
\ somethingMobileApp \ somethingMobileAppAndroid \ MainActivity.cs:50 07-20:35:39.708 D / Mono(1452):DllImport搜索:' __内部' ('(空)&#39)。 07-20 11:35:39.712 D / Mono(1452):搜索' java_interop_jnienv_new_string'。 07-20 11:35:39.712 D / Mono(1452):探索' java_interop_jnienv_new_string'。 07-20 11:35:39.712 D / Mono(1452):发现为' java_interop_jnienv_new_string'。 07-20 11:35:39.716 D / Mono(1452):DllImport搜索:' __内部' ('(空)&#39)。 07-20 11:35:39.716 D / Mono(1452):搜索' java_interop_jnienv_throw'。 07-20 11:35:39.716 D / Mono(1452):探索' java_interop_jnienv_throw'。 07-20 11:35:39.716 D / Mono(1452):发现为' java_interop_jnienv_throw'。 发生了未处理的异常。
07-20 11:35:42.112 E / mono(1452): 07-20 11:35:42.112 E / mono(1452):未处理的异常: 07-20 11:35:42.112 E / mono(1452):System.NotImplementedException:未实现方法或操作。 07-20 11:35:42.112 E / mono(1452):at(包装器动态方法)System.Object:c637c172-2e79-4a17-a720-5e2325d945f7(intptr,intptr,intptr) 07-20 11:35:42.112 E / mono(1452):at(包装器本机到托管)System.Object:c637c172-2e79-4a17-a720-5e2325d945f7(intptr,intptr,intptr) 在mgmain JNI_OnLoad中 07-20 11:35:42.112 E / mono-rt(1452):[ERROR]致命未处理异常:System.NotImplementedException:未实现方法或操作。 07-20 11:35:42.112 E / mono-rt(1452):at(包装器动态方法)System.Object:c637c172-2e79-4a17-a720-5e2325d945f7(intptr,intptr,intptr) 07-20 11:35:42.112 E / mono-rt(1452):at(包装器本机到托管)System.Object:c637c172-2e79-4a17-a720-5e2325d945f7(intptr,intptr,intptr)
有什么建议吗? :)
答案 0 :(得分:1)
您看到的错误可能是由Mono和Xamarin.Android中WCF实施的当前限制引起的。为了猜测,身份验证模式可能是问题的核心:
支持
BasicHttpSecurityMode.Transport
身份验证:
http://docs.xamarin.com/guides/cross-platform/application_fundamentals/web_services/#Calling_a_WCF_Service_with_Client_Credential_Security尚未支持
BasicHttpSecurityMode.TransportWithMessageCredential
的身份验证:
http://forums.xamarin.com/discussion/6493/wcf-basichttpbinding-with-transportwithmessagecredential-username-failure-ios-and-android
(来自http://forums.xamarin.com/discussion/comment/44741/#Comment_44741)
答案 1 :(得分:0)
来自xamarin文档:
使用客户端凭据安全性 WCF服务还可能要求服务客户端使用凭据进行身份验证。 Xamarin平台不支持WS-Security协议,它允许客户端在SOAP消息信封内发送凭据。但是,Xamarin平台支持通过指定适当的ClientCredentialType将HTTP基本身份验证凭据发送到服务器的能力:
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; 然后,可以指定基本身份验证凭据:
client.ClientCredentials.UserName.UserName = @" foo&#34 ;; client.ClientCredentials.UserName.Password = @" mrsnuggles";
发现于:https://developer.xamarin.com/guides/cross-platform/application_fundamentals/web_services/#wcf
表示已实施客户端身份验证
答案 2 :(得分:0)
这就是为什么我将早期答案标记为正确的答案。
Xamarin不支持TransportWithMessageCredential。 他们确实支持TransportCredentialOnly。
BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential)在调用服务时给出错误。
我遇到的问题是MSDN指出应谨慎使用TransportCredentialOnly,因为它通过http以纯文本形式发送用户名和密码。
我希望xamarin能够实现更安全的与wcf交谈的方式。例如TransportWithMessageCredential或WSHTTPBINDING。