我可以在控制台应用中从mvc 3网络应用获取用户ID吗?

时间:2013-01-29 07:31:51

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

我需要在控制台应用中从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>

2 个答案:

答案 0 :(得分:0)

为什么不在控制器上使用公共方法,并在控制台应用程序中创建Web请求以调用方法?

好吧,这是相当通用的。

首先你需要在你的控制器上使用一个带有一些参数的动作menthod

    [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方法。

答案 1 :(得分:0)

发生异常,因为在MembershipRepository中我使用内置的Membership提供程序来返回Users。我将强制更改为使用数据上下文:

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的实例(并直接使用数据上下文)