【问题标题】:Differentiate between client app and browser in ASMX Web Service?区分 ASMX Web 服务中的客户端应用程序和浏览器?
【发布时间】:2010-08-10 14:59:15
【问题描述】:

这是Choosing a Connection String based on kind of request 的后续行动,我没有得到答案,而我认为有效的方法也没有。

我有一个 web 服务,它需要根据用户从浏览器或客户端应用程序调用它来选择特定的连接字符串。

我试过了:

HttpContext.Current != null? ConnectionStrings["Website"].ConnectionString : ConnectionStrings["Client"].ConnectionString

但意识到在某些时候即使我使用客户端应用程序,也有一些 HttpContext(如果有人能解释为什么它会很棒)但 Request 下的 Browser 字段是 "Unknown"。所以,然后我尝试了:

if ( HttpContext.Current != null )
{
  if ( HttpContext.Current.Request.Browser != "Unknown" )
  {
     //browser connection string here
  }
  else
     //client app connection string here
}
else
  //client app connection string here

这在调试时产生了奇迹,但在测试环境中,即使从客户端应用程序调用,它仍然指向浏览器连接字符串,好像在某些时候浏览器不是“未知”...

有没有更容易/更简单的方法来做到这一点?我这样做的方式看起来真的很丑。

我现在很绝望,因为我不知道为什么会这样..

【问题讨论】:

  • 嗯,你需要在测试过程中记录Browser的值,看看它到底是什么。
  • 你能补充更多细节吗?您使用的是 WCF 还是 WebMethods?浏览器如何访问您的网络服务?不是通过 SOAP,我想?
  • 柯克,我正在使用 WebMethods。我会尝试罗伯特的建议。
  • @Robert Harvey:我做到了,它返回“未知”......但它仍然使用服务器字符串。
  • Web 服务有自己的 HttpContext。

标签: c# sql-server web-services asmx connection-string


【解决方案1】:

与其检测和打开浏览器类型,不如考虑以下两个建议:

添加自定义请求标头

在您的各种调用者中,在您的 Http 请求中定义一个新的自定义标头。

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Headers.Add("CallerType", "ClientApp"); // "Browser", etc.

那么您就可以准确可靠地知道调用的是哪种类型的客户端。这很难出错,也不会被欺骗/弄错。

在 QueryString 中包含调用者类型

myService.asmx?BrowserType=1

向您的 .asmx 网络方法添加一个简单的新查询字符串参数。这在受控环境中同样有效,但如果其他用户/开发人员弄错了,或者预期值不正确,您就必须采取其他措施来纠正/处理。

两者都允许您轻松确定传入值的 connString。也许没有修饰符/标题,你可以假设一个默认值。您的示例问题有 2 个基本结果,任何建议的解决方案都易于扩展(浏览器、客户端应用程序、iPhone、whathaveyou)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2016-04-10
    • 1970-01-01
    • 2017-03-02
    • 2014-07-04
    • 2012-02-04
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多