【问题标题】:Empty HttpContext when calling WCF webservice调用 WCF Web 服务时为空 HttpContext
【发布时间】:2008-11-10 22:50:09
【问题描述】:

我最近编写了一个与 Silverlight 一起使用的 Web 服务,它使用 ASP.net 成员资格和角色。

为了验证服务中的客户端,我查看了 HTTPContext.Current.User(从 Silverlight 调用服务时有效)

但是,我一直在尝试从 asp.net 回发中调用相同的服务。但是当我逐步进入服务时,HTTPContext.Current 的用户名字符串为空。

我猜我在 web.config 文件中没有做一些事情,导致 httpContext 无法通过代理发送到我的服务?

任何想法将不胜感激。我需要能够以某种方式使用 asp.net 成员资格和角色来验证客户端,并让它在 asp.net 客户端和 silverlight 客户端上都能正常工作。

【问题讨论】:

  • 您能否详细解释一下 ASP.NET 调用的来源?它与服务处于相同的上下文中吗?您是在强迫他们在使用服务之前登录网站吗?
  • 他们登录网站(尽管他们无需登录也可以浏览)我在回发期间调用该服务。我可以查看使用登录用户填充的回发中的 HttpContext。但在服务端,HttpContext 是空的。
  • 我不完全知道您所说的相同上下文是什么意思,如果您的意思是,该服务将托管在与应用程序不同的位置。
  • 我已在服务的 web.config 中启用了 asp 兼容性。但是我在绑定中的安全模式设置为无,这可能是它没有发送凭据的问题吗?
  • 他们如何从 Silveright 登录服务?你能发布两个客户经历的步骤吗?抱歉,但我仍然不完全清楚你在这里做什么。

标签: wcf silverlight web-services


【解决方案1】:

我已经解决了!

看起来默认情况下,Silverlight 应用程序将所有浏览器 cookie 发送到服务。这些 cookie 之一是“.ASPXAUTH”cookie,用于针对成员资格和角色进行身份验证。

然而,asp.net 应用程序并未将 cookie 发送到服务。为了发送授权 cookie,我在调用我的 webservice 方法之前使用了以下代码。

    using (OperationContextScope scope = new OperationContextScope(ws.InnerChannel))
    {
HttpRequestMessageProperty httpRequest = new HttpRequestMessageProperty();
OperationContext.Current.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name, httpRequest);

            HttpCookieCollection cc = Page.Request.Cookies;
            if (Request.Cookies[".ASPXAUTH"] != null)
            {
                HttpCookie aCookie = Request.Cookies[".ASPXAUTH"];
                String authcookieValue = Server.HtmlEncode(aCookie.Value);
                httpRequest.Headers.Add("Cookie: " + ".ASPXAUTH=" + authcookieValue);

            }
// Webservice call goes here
    }

【讨论】:

    【解决方案2】:

    尝试使用 ServiceSecurityContext.Current.PrimaryIdentity 代替 HTTPContext

    【讨论】:

    • ServiceSecurityContext 为空 - 虽然我确实有 对于服务,但也许我必须设置证书或其他东西?
    【解决方案3】:

    不确定它在 Silverlight 中如何工作,但不是 ASP.Net,但对于初学者来说,这是一个很好的 blog post on how to setup WCF to work with ASP.Net membership providers。有很多步骤,因此很容易错过设置。

    一旦你让它正常工作,我想两者都应该正常工作。

    【讨论】:

      【解决方案4】:

      我想可能是因为我的 wcf 服务在我的 silverlight.web 项目中,也许他们在分享方面更友好。

      我可能需要阅读更多关于 wcf 的内容并通过建立一个单独的 Web 服务项目来更好地分离关注点?

      【讨论】:

        【解决方案5】:

        更新:

        好的,我已经查看了使用 Fiddler 的 HTTP Post 请求

        看起来 Silverlight 应用正在发送带有授权 cookie 的“状态”,而我的 asp.net 应用没有。

        看起来我需要在调用服务时发送状态 + 我的授权 cookie。我可能需要尽快提出一个新问题...

        【讨论】:

          猜你喜欢
          • 2014-03-31
          • 1970-01-01
          • 2015-12-29
          • 2014-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多