wcf PerSession (Wshttpbinding) with Portable Class Library (PCL)
wcf PerSession (Wshttpbinding) with Portable Class Library (PCL)
似乎便携式 Class 库不支持为此所需的 PerSession (Wshttpbinding)。
有什么解决办法吗?
我有 xamarin 表单应用程序(服务器客户端),用户可以连接到他们自己的数据库并获取或更新数据。
一旦用户提供了他的用户名和密码,一些信息必须存储到他们的会话中,比如数据库连接字符串,当用户请求数据时,存储到他的会话中的适当连接字符串将用于该数据库并将数据发回。
否则我不得不将来自客户端的连接字符串传递给每个函数。
我怎样才能避免这种情况?便携式 Class 库不支持 wshttpbinding,因此我无法使用 PerSession
有什么帮助吗?
太头疼了
对于使用以下组合的任何人来说,障碍都太大了
- Xamarin 表单
- PCL(便携式 Class 图书馆)
- WCF
- IClientMessageInspector
问题:
我需要一个多客户端应用程序,每个客户端都可以连接到自己的数据库(所有模式都相同)
为此,我希望在会话级别存储一些信息,例如(连接字符串、用户信息),因此当调用一个方法以了解我将从哪个数据库检索数据时。
问题#1(我花了5天的时间理解和实现)
- Session 不能与 PCL(WCF PerSession)一起工作,为什么?因为 PerSession 需要 WsHttpBinding 但 PCL 不支持 WsHttpBinding only BasicHttp
问题 #2(我花了 3 天时间才明白为什么不起作用)
然后我在这里和那里看到了很多关于实现 IClientMessageInspector 的帖子(查看在线示例如何实现 IClientMessageInspector 这很容易) 所以每次客户端请求调用以向服务器发送一些额外信息时,在我的例子中调用是 connectionString。在这里我遇到了一个例外
NotImplementedException。为什么?因为这个 BUG in MONO
https://bugzilla.xamarin.com/show_bug.cgi?id=40064
简单来说
在 PCL(针对 .NET Core)中创建 WCF 客户端时,您必须使用 EndpointBehaviors 而不是 Behaviors。这在 Windows RT 应用程序中工作正常,但 Mono 尚未实现此功能,因此在 Android 和 iOS.
中产生 NotImplementedException
答案在上面的 link 上,来自其他人的另一个回复,我为此感谢他。
简单来说
而不是
MyService.Endpoint.EndpointBehaviors(New MyBehavior)
使用
Dim prop = MyService.Endpoint.GetType.GetTypeInfo.GetDeclaredProperty("Behaviors")
Dim obj = CType(prop.GetValue(MyService.Endpoint), KeyedCollection(Of Type, IEndpointBehavior))
obj.Add(New Behavior)
而不是
clientRuntime.ClientMessageInspectors.Add(New MyInspector)
使用
Public Sub ApplyClientBehavior(endpoint As ServiceEndpoint, clientRuntime As ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior
Dim prop = clientRuntime.GetType.GetTypeInfo.GetDeclaredProperty("MessageInspectors")
Dim obj = CType(prop.GetValue(clientRuntime), ICollection(Of IClientMessageInspector))
obj.Add(New MyInspector)
End Sub
无需更改配置文件
希望有一天这对某人有所帮助。
似乎便携式 Class 库不支持为此所需的 PerSession (Wshttpbinding)。
有什么解决办法吗?
我有 xamarin 表单应用程序(服务器客户端),用户可以连接到他们自己的数据库并获取或更新数据。 一旦用户提供了他的用户名和密码,一些信息必须存储到他们的会话中,比如数据库连接字符串,当用户请求数据时,存储到他的会话中的适当连接字符串将用于该数据库并将数据发回。
否则我不得不将来自客户端的连接字符串传递给每个函数。
我怎样才能避免这种情况?便携式 Class 库不支持 wshttpbinding,因此我无法使用 PerSession
有什么帮助吗?
太头疼了
对于使用以下组合的任何人来说,障碍都太大了
- Xamarin 表单
- PCL(便携式 Class 图书馆)
- WCF
- IClientMessageInspector
问题:
我需要一个多客户端应用程序,每个客户端都可以连接到自己的数据库(所有模式都相同)
为此,我希望在会话级别存储一些信息,例如(连接字符串、用户信息),因此当调用一个方法以了解我将从哪个数据库检索数据时。
问题#1(我花了5天的时间理解和实现)
- Session 不能与 PCL(WCF PerSession)一起工作,为什么?因为 PerSession 需要 WsHttpBinding 但 PCL 不支持 WsHttpBinding only BasicHttp
问题 #2(我花了 3 天时间才明白为什么不起作用)
然后我在这里和那里看到了很多关于实现 IClientMessageInspector 的帖子(查看在线示例如何实现 IClientMessageInspector 这很容易) 所以每次客户端请求调用以向服务器发送一些额外信息时,在我的例子中调用是 connectionString。在这里我遇到了一个例外
NotImplementedException。为什么?因为这个 BUG in MONO https://bugzilla.xamarin.com/show_bug.cgi?id=40064
简单来说
在 PCL(针对 .NET Core)中创建 WCF 客户端时,您必须使用 EndpointBehaviors 而不是 Behaviors。这在 Windows RT 应用程序中工作正常,但 Mono 尚未实现此功能,因此在 Android 和 iOS.
中产生 NotImplementedException答案在上面的 link 上,来自其他人的另一个回复,我为此感谢他。
简单来说
而不是
MyService.Endpoint.EndpointBehaviors(New MyBehavior)
使用
Dim prop = MyService.Endpoint.GetType.GetTypeInfo.GetDeclaredProperty("Behaviors")
Dim obj = CType(prop.GetValue(MyService.Endpoint), KeyedCollection(Of Type, IEndpointBehavior))
obj.Add(New Behavior)
而不是
clientRuntime.ClientMessageInspectors.Add(New MyInspector)
使用
Public Sub ApplyClientBehavior(endpoint As ServiceEndpoint, clientRuntime As ClientRuntime) Implements IEndpointBehavior.ApplyClientBehavior
Dim prop = clientRuntime.GetType.GetTypeInfo.GetDeclaredProperty("MessageInspectors")
Dim obj = CType(prop.GetValue(clientRuntime), ICollection(Of IClientMessageInspector))
obj.Add(New MyInspector)
End Sub
无需更改配置文件
希望有一天这对某人有所帮助。