【问题标题】:WCF REST-service: passing country codeWCF REST-service:传递国家代码
【发布时间】:2011-11-29 10:49:02
【问题描述】:

我有一个 WCF REST 服务,供不同国家/地区使用的移动应用程序使用。它接受并返回 JSON,我使用 StructureMap。

想法是为所有国家/地区创建一个服务实例,但我需要知道哪个国家/地区正在调用该服务并在服务中对此进行一些逻辑处理(例如,确定要使用的连接字符串)。

但是,我想避免每次服务请求都必须传递国家代码。我在这里有什么选择?

例如,我可以为每个国家/地区设置一个端点吗?但在这种情况下,我怎么知道调用服务时使用了哪个端点/国家代码?

也许还有其他可能性?

【问题讨论】:

  • 你说的是用户的位置还是用户的区域?它们非常不同!
  • 真的是安装应用时确定的国家代码,比如'it'或'be'。

标签: c# wcf rest endpoint


【解决方案1】:

多个端点可能是一种解决方案,但您需要一种可靠的方法来确定实际使用了哪个端点。鉴于 WCF REST 服务的“断开连接”性质(我的意思是使用非 WCF 类型进行通信并仅使用 WCF 属性),这将需要您编写一个 WebHostFactory 来指定创建服务的国家/地区对于给定的端点。您可以检查WebOperationCurrent.Current 实例以访问隐藏在您的方法签名中的信息。例如:

Uri requestRoot = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri;
if (requestRoot.PathAndQuery.Contains("en-us")) {
    // use english locale
}
else if (requestRoot.PathAndQuery.Contains("de-de")) {
    // use german locale
}

您需要更好的策略来确定实际的国家/地区/语言,但基本想法是在多个路径下重新托管相同的服务,并使用当前的 WebOperationContext 实例检查请求中的这些路径。

编辑 从上面的 cmets 中,我想补充一点,您可以使用 WebOperationContext 访问当前请求的 UserAgent 字符串。因此,您还可以检查这些信息以寻找有关所请求语言的线索。但请记住,这些“隐含”信息只是线索,但绝不会明确表明用户想要什么。

【讨论】:

  • 谢谢。在 WebHostFactory 中指定国家:是否意味着为每个端点创建单独的 ServiceHost?如何为每个端点添加不同的自定义数据?
  • 您向服务主机提供了一个自定义的IInstanceProvider,它会生成一个带有Language 属性集的服务实例。这个想法是,让服务实例知道它所使用的语言,然后通过 WebServiceHostFactory 指定该语言。
  • 好的,但这和直接在服务实现中访问 WebOperationContext 不一样吗?
  • 是的,这两种方法都可以解决您的问题。我会说这取决于你什么更适合你现有的解决方案。
  • 谢谢,只有一件事:如果我将服务操作定义为“每次调用”,那就意味着每个实例都有自己的 WebOperationContext,对吧?
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
相关资源
最近更新 更多