0

コンソール アプリで 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 サーバー データベースに接続できません。

例外が発生する前に、ウィンドウがポップアップします: このプログラムには互換性の問題があります (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>
4

2 に答える 2

0

コントローラーにパブリック メソッドを用意し、コンソール アプリでメソッドを呼び出す 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);

そうですか?Web リクエストを確認してください。私が持っているものからコピーし、多くの diff メソッドであったように再構築する必要がありました。

于 2013-01-29T07:53:31.300 に答える
0

MembershipRepository で組み込みのメンバーシップ プロバイダーを使用してユーザーを返すため、例外が発生しました。データ コンテキストで動作するように実装を変更しました。

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();
    }
}

すべてが機能し、Web リクエストを使用する必要はありません)

そのため、MembershipRepository の新しいインスタンスまたは YourAppNameDataContext のインスタンスを作成できます (データ コンテキストを直接操作できます)。

于 2013-01-29T17:36:42.477 に答える