【问题标题】:Can I get user id from mvc 3 web app in console app?我可以从控制台应用程序中的 mvc 3 Web 应用程序获取用户 ID 吗?
【发布时间】:2013-01-31 05:11:30
【问题描述】:

我需要从控制台应用程序中的 asp.net mvc 3 应用程序获取用户 ID。这是我的代码:(mvc)

public class MembershipRepository : IMembershipRepository
{
    public Guid GetUserId(string name)
    {
        var providerUserKey = Membership.GetUser(name).ProviderUserKey; // HttpException
        if (providerUserKey != null)
            return (Guid)providerUserKey;
        throw new NullReferenceException("user with this username does't exist");
    }
}

(控制台)代码:

ninjectKernel.Bind<IMembershipRepository>().To<MembershipRepository>();
var membershipRepository = ninjectKernel.Get<IMembershipRepository>();
Guid userId = membershipRepository.GetUserId("admin");

HttpException: 无法连接到 Sql server 数据库。

异常发生前弹出窗口:此程序存在兼容性问题(microsoft sql seqver 2008 和 2008 r2)。
我已经安装了 sql server 2012。

此外,它只是一小段代码。在我尝试获取 userId 之前,我使用其他存储库将数据添加到数据库并且它可以工作:当我检查表内容时,它充满了新条目。

我需要如何更改代码? Mabby 还有其他方法可以在控制台应用程序中获取 userId 吗?

谢谢!

编辑:

App.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add
       name="WebStoreConnectionString" connectionString="Data Source=(LocalDB)\v11.0; DataBase=WebStore;
          AttachDbFilename=C:\Users\Aleksey\repos\working_copy\WebStore\WebStore\App_Data\WebStore.mdf;
          Integrated Security=True;Connect Timeout=30"
          providerName="System.Data.SqlClient"
    />
 </connectionStrings>
</configuration>

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 console-application


    【解决方案1】:

    为什么在你的控制器上没有一个公共方法,并在你的控制台应用程序中创建一个 Web 请求来调用该方法?

    好的,这是相当通用的。

    首先,您需要在控制器上设置一个带有一些参数的操作方法

        [HttpPost]
        public guid MyActionMethod(string name)
        {
    
        }
    

    然后你需要创建一个调用该方法的web请求

           UTF8Encoding encoding = new UTF8Encoding();
    
           string messageBody = "name=myName"
           byte[] requestBody = encoding.GetBytes(messageBody);
    
           HttpWebRequest WRequest;
    
            CredentialCache myCredCache = new CredentialCache();
            myCredCache.Add(new Uri(targetUrl), "NTLM", (NetworkCredential) CredentialCache.DefaultCredentials);
    
            WRequest = (HttpWebRequest)HttpWebRequest.Create("http://servername/controllerName/MyActionMethod/?" + messageBody);
    
            WRequest.Credentials = myCredCache;
            WRequest.UnsafeAuthenticatedConnectionSharing = true;
            WRequest.PreAuthenticate = false;
            WRequest.Method = "POST";
            WRequest.Timeout = 10000;
            WRequest.ContentLength = request.Length;
            WRequest.SendChunked = true;
    
            using (Stream requestStream = WRequest.GetRequestStream())
                requestStream.Write(requestBody, 0, requestBody.Length);
    

    我觉得对吗?检查网络请求,我从一些我有的地方复制了它,并且不得不重建它,因为它在许多 diff 方法中。

    【讨论】:

    • 一个问题:如何获取userId??? action 方法应该有字符串参数(name)和检索 Guid(userId)。
    【解决方案2】:

    发生异常是因为在 MembershipRepository 中我使用了内置的 Membership 提供程序来返回用户。我将实现更改为使用数据上下文:

    public class MembershipRepository : IMembershipRepository
    {
        private readonly WebStoreDataContext _dataContext;
    
        public MembershipRepository(WebStoreDataContext dataContext)
        {
            _dataContext = dataContext;
        }
    
        public IEnumerable<User> GetUsers()
        {
            return _dataContext.Users;
        }
    
        public Guid GetUserId(string name)
        {
            return _dataContext.Users.Where(u => u.UserName == name).Select(u => u.UserId).Single();
        }
    }
    

    一切正常,我不需要使用网络请求)

    因此,您可以创建 MembershipRepository 的新实例或 YourAppNameDataContext 的实例(并直接使用数据上下文)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多