代码之家  ›  专栏  ›  技术社区  ›  Eton B.

在ASMX Web服务中区分客户端应用程序和浏览器?

  •  4
  • Eton B.  · 技术社区  · 14 年前

    这是对 Choosing a Connection String based on kind of request 对此我没有答案,我认为有效的东西也没有。

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

    我试过:

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

    但我意识到,在某些时候,即使我正在使用客户机应用程序,也会有一些httpContext(如果有人能解释为什么它会很棒),但是 Browser 场下 Request "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
    

    这在调试时很管用,但在测试环境中,它仍然指向浏览器连接字符串,即使是从客户端应用程序调用时,就好像在某个时刻浏览器不是“未知的”…

    有没有更容易/更简单的方法?我的做法看起来很难看。

    我现在非常绝望,因为我不知道这是为什么……

    1 回复  |  直到 14 年前
        1
  •  1
  •   p.campbell    14 年前

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

    添加自定义请求头

    在各种调用程序中,在HTTP请求中定义一个新的自定义头。

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

    然后,您就可以准确可靠地知道正在调用的客户机类型。这很难出错,也不会被欺骗/弄错。

    在查询字符串中包含调用方类型

    myService.asmx?BrowserType=1
    

    向.asmx webmethod添加一个简单的新querystring参数。这在受控环境中也会起到同样的作用,但是如果其他用户/开发人员弄错了,或者使期望值的格式不正确,您就必须采取其他措施来纠正/处理。

    两者都允许您轻松确定传入值的连接。也许是缺少了一个修饰符/头,您可以假定为默认值。您的示例问题有两个基本结果,其中一个建议的解决方案很容易扩展(浏览器、客户端应用程序、iPhone、Whathaweyou)。