【问题标题】:Calling an MVC3 action from a SQL CLR stored procedure从 SQL CLR 存储过程调用 MVC3 操作
【发布时间】:2012-02-23 23:09:18
【问题描述】:

我正在处理一个 CLR 存储过程,该过程在使用 Windows 身份验证的 ASP.NET MVC3 应用程序中调用控制器操作(其他所有功能都被禁用)。 Web 服务器是在 Windows Server 2008 R2 Standard 上运行的 IIS 7.5。数据库服务器为 SQL Server 2008 R2 企业版。这是CLR proc的代码:

[SqlProcedure]
public static void UpdateModels()
{
    Uri uri = null;
    HttpWebRequest rq;
    HttpWebResponse rsp;

    Uri.TryCreate("http://testserver/RPM/Configuration/UpdateModels", UriKind.Absolute, out uri);
    rq = (HttpWebRequest)HttpWebRequest.Create(uri);
    rq.Method = WebRequestMethods.Http.Get;
    rsp = (HttpWebResponse)rq.GetResponse();
}

我能够毫无问题地将程序集部署到 SQL Server,但是当我运行它时,我收到以下错误:

Msg 6522, Level 16, State 1, Procedure UpdateModels, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "UpdateModels": 
System.Net.WebException: The remote server returned an error: (401) Unauthorized.
System.Net.WebException: 
   at System.Net.HttpWebRequest.GetResponse()
   at StoredProcedures.UpdateModels()
.

当我从 SQL 代理作业(在我的凭据下运行)调用 SP,当我从 SSMS 查询窗口(再次,我的凭据)或我想尝试的任何其他方法执行它时,会发生这种情况。我是 Web 应用程序的授权用户,并且能够从应用程序本身调用该控制器方法。

如果我将 URL 更改为“http://testserver”,它运行正常(当然,它什么也不做),但如果我在 URL 中添加“RPM”,它会失败,所以它似乎问题出在应用程序本身,而不是服务器或其默认站点。此外,如果我启用匿名身份验证,它会起作用,因此 Windows 凭据不会以某种方式传递到该站点。检查日志确认了这一点:

2012-02-23 12:51:33 10.1.1.1 GET /RPM/Configuration/UpdateModels - 80 - 10.2.2.2- 302 0 0 218

凭据未通过。我尝试在 CLR SP 代码中使用模拟,但这没有帮助。我确信很明显,我对这些东西很陌生,可能正在做一些愚蠢的事情。如果有人能让我走上正确的道路,我将不胜感激!

TIA,

杰夫

【问题讨论】:

    标签: asp.net-mvc-3 sqlclr


    【解决方案1】:

    好吧,正如我所担心的那样,我在做一些愚蠢的事情。原来模拟的答案,但我只需要设置模拟级别:

    rq.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
    

    在调用GetResponse 方法之前。之后,提供的凭据会按照我最初的预期传递给 MVC3 控制器。

    我想我会发布这个以防其他人像我一样挣扎。

    杰夫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多