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

无需更改配置文件

希望有一天这对某人有所帮助。