Xamarin WCF BasicHttpBinding - 方法或操作未实现
Xamarin WCF BasicHttpBinding - Method or operation is not implemented
快速背景信息:
有一个使用 BasicHttpBinding 的带有身份验证的 wcf。 Dataservice.cs 包含基于服务元数据(使用 svcutil 生成)的 dataserviceclient。
我首先使用代码制作了一个控制台应用程序并且它运行良好,然后我制作了一个 xamarin android 项目。我复制了代码。引用 system.runtime.serialization 和 system.servicemodel。这给了我一个 The method or operation is not implemented 错误。
主要代码:
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 编程的新手,所以我可能在这里遗漏了关键点,但请记住,这是一个控制台应用程序,并且服务是在线的(不是本地主机)。
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 11: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 绑定) [0x00000] 在
/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): 在 System.ServiceModel.Channels.Binding.CanBuildChannelFactory[TChannel] (System.ServiceModel.Channels.BindingParameterCollection 参数) [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] 在
/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] 在
/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 超时) [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] 在
/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] 在
/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] 在
/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] 在
/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] 在
/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): 在 DataServiceClient.GetProjects (Int32 firmaid) [0x00001] in C:\Users\username\documents\visual studio 2015\Projects\somethingMobileApp
\somethingMobileAppAndroid\DataService.cs:10752
07-20 11:35:39.708 I/MonoDroid( 1452): 在 somethingMobileAppAndroid.MainActivity.OnCreate (Android.OS.Bundle bundle) [0x0006d] in C:\Users\username\documents\visual studio 2015\Projects
\somethingMobileApp\somethingMobileAppAndroid\MainActivity.cs:50
07-20 11:35:39.708 D/Mono ( 1452): DllImport 搜索:'__Internal' ('(null)')。
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 搜索:'__Internal' ('(null)')。
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): 在(包装动态方法)System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr,intptr)
07-20 11:35:42.112 E/mono ( 1452): at (wrapper native-to-managed) System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr,intptr)
在 mgmain JNI_OnLoad
07-20 11:35:42.112 E/mono-rt ( 1452): [ERROR] FATAL UNHANDLED EXCEPTION: System.NotImplementedException: 方法或操作未实现。
07-20 11:35:42.112 E/mono-rt ( 1452): at (wrapper dynamic-method) System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr,intptr)
07-20 11:35:42.112 E/mono-rt ( 1452): at (wrapper native-to-managed) System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr, intptr)
有什么建议吗? :)
您看到的错误可能是由 Mono 和 Xamarin.Android 中 WCF 实现的当前限制引起的。猜测一下,认证模式可能是问题的核心:
Authentication with BasicHttpSecurityMode.Transport
is supported:
http://docs.xamarin.com/guides/cross-platform/application_fundamentals/web_services/#Calling_a_WCF_Service_with_Client_Credential_Security
Authentication with BasicHttpSecurityMode.TransportWithMessageCredential
is not (yet) supported:
http://forums.xamarin.com/discussion/6493/wcf-basichttpbinding-with-transportwithmessagecredential-username-failure-ios-and-android
(来自 http://forums.xamarin.com/discussion/comment/44741/#Comment_44741)
来自 xamarin 文档:
使用客户端凭据安全
WCF 服务可能还需要服务客户端使用凭据进行身份验证。 Xamarin 平台不支持 WS-Security 协议,该协议允许客户端在 SOAP 消息信封内发送凭据。但是,Xamarin 平台确实支持通过指定适当的 ClientCredentialType:
将 HTTP 基本身份验证凭据发送到服务器的能力
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
然后,可以指定基本身份验证凭据:
client.ClientCredentials.UserName.UserName = @"foo";
client.ClientCredentials.UserName.Password = @"mrsnuggles";
发现于:https://developer.xamarin.com/guides/cross-platform/application_fundamentals/web_services/#wcf
表示实现了客户端认证
这是答案,这就是为什么我将之前的答案标记为正确的原因。
Xamarin 不支持 TransportWithMessageCredential。
他们确实支持 TransportCredentialOnly。
BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential) 调用服务时给出错误。
我遇到的问题是 MSDN 指出应谨慎使用 TransportCredentialOnly,因为它通过 http 以纯文本形式发送用户名和密码。
我希望 xamarin 能实现一种更安全的与 wcf 对话的方式。例如 TransportWithMessageCredential 或 WSHTTPBINDING。
快速背景信息: 有一个使用 BasicHttpBinding 的带有身份验证的 wcf。 Dataservice.cs 包含基于服务元数据(使用 svcutil 生成)的 dataserviceclient。
我首先使用代码制作了一个控制台应用程序并且它运行良好,然后我制作了一个 xamarin android 项目。我复制了代码。引用 system.runtime.serialization 和 system.servicemodel。这给了我一个 The method or operation is not implemented 错误。
主要代码:
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 编程的新手,所以我可能在这里遗漏了关键点,但请记住,这是一个控制台应用程序,并且服务是在线的(不是本地主机)。
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 11: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 绑定) [0x00000] 在
/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): 在 System.ServiceModel.Channels.Binding.CanBuildChannelFactory[TChannel] (System.ServiceModel.Channels.BindingParameterCollection 参数) [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] 在
/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] 在
/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 超时) [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] 在
/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] 在
/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] 在
/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] 在
/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] 在
/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): 在 DataServiceClient.GetProjects (Int32 firmaid) [0x00001] in C:\Users\username\documents\visual studio 2015\Projects\somethingMobileApp
\somethingMobileAppAndroid\DataService.cs:10752 07-20 11:35:39.708 I/MonoDroid( 1452): 在 somethingMobileAppAndroid.MainActivity.OnCreate (Android.OS.Bundle bundle) [0x0006d] in C:\Users\username\documents\visual studio 2015\Projects
\somethingMobileApp\somethingMobileAppAndroid\MainActivity.cs:50 07-20 11:35:39.708 D/Mono ( 1452): DllImport 搜索:'__Internal' ('(null)')。 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 搜索:'__Internal' ('(null)')。 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): 在(包装动态方法)System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr,intptr) 07-20 11:35:42.112 E/mono ( 1452): at (wrapper native-to-managed) System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr,intptr) 在 mgmain JNI_OnLoad 07-20 11:35:42.112 E/mono-rt ( 1452): [ERROR] FATAL UNHANDLED EXCEPTION: System.NotImplementedException: 方法或操作未实现。 07-20 11:35:42.112 E/mono-rt ( 1452): at (wrapper dynamic-method) System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr,intptr) 07-20 11:35:42.112 E/mono-rt ( 1452): at (wrapper native-to-managed) System.Object:c637c172-2e79-4a17-a720-5e2325d945f7 (intptr,intptr, intptr)
有什么建议吗? :)
您看到的错误可能是由 Mono 和 Xamarin.Android 中 WCF 实现的当前限制引起的。猜测一下,认证模式可能是问题的核心:
Authentication with
BasicHttpSecurityMode.Transport
is supported:
http://docs.xamarin.com/guides/cross-platform/application_fundamentals/web_services/#Calling_a_WCF_Service_with_Client_Credential_SecurityAuthentication with
BasicHttpSecurityMode.TransportWithMessageCredential
is not (yet) supported:
http://forums.xamarin.com/discussion/6493/wcf-basichttpbinding-with-transportwithmessagecredential-username-failure-ios-and-android
(来自 http://forums.xamarin.com/discussion/comment/44741/#Comment_44741)
来自 xamarin 文档:
使用客户端凭据安全 WCF 服务可能还需要服务客户端使用凭据进行身份验证。 Xamarin 平台不支持 WS-Security 协议,该协议允许客户端在 SOAP 消息信封内发送凭据。但是,Xamarin 平台确实支持通过指定适当的 ClientCredentialType:
将 HTTP 基本身份验证凭据发送到服务器的能力basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; 然后,可以指定基本身份验证凭据:
client.ClientCredentials.UserName.UserName = @"foo"; client.ClientCredentials.UserName.Password = @"mrsnuggles";
发现于:https://developer.xamarin.com/guides/cross-platform/application_fundamentals/web_services/#wcf
表示实现了客户端认证
这是答案,这就是为什么我将之前的答案标记为正确的原因。
Xamarin 不支持 TransportWithMessageCredential。 他们确实支持 TransportCredentialOnly。
BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential) 调用服务时给出错误。
我遇到的问题是 MSDN 指出应谨慎使用 TransportCredentialOnly,因为它通过 http 以纯文本形式发送用户名和密码。
我希望 xamarin 能实现一种更安全的与 wcf 对话的方式。例如 TransportWithMessageCredential 或 WSHTTPBINDING。