2

Web APIに基本認証を使用していますが、次のエラーが発生します

* {"メッセージ": "エラーが発生しました。"、 "例外メッセージ": "SQLServerへの接続の確立中にネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しく、SQL Serverがリモート接続を許可するように構成されている(プロバイダー:Named Pipes Provider、エラー:40-SQLへの接続を開くことができませんでした*

APIから基本認証の実装を削除すると、完全に正常に機能します。したがって、問題は基本認証の実装に使用しているsystem.web.providersに関連するものであると推測しています。

これは私の接続文字列がどのように見えるかです

<connectionStrings>
<add name="DefaultConnection" connectionString="Password=password;Persist Security Info=True;User ID=wbuser;Initial Catalog=WinBouts_com;Data Source=WINBOUTSAPIVM"
  providerName="System.Data.SqlClient" />
<add name="WinBoutsConnectionString" connectionString="Password=password;Persist Security Info=True;User ID=wbuser;Initial Catalog=WinBouts_com;Data Source=WINBOUTSAPIVM"
  providerName="System.Data.SqlClient" />    

また、セッションプロバイダーが追加されているweb.configにエラーが表示されます。エラーには、「connectionStringName属性は許可されていません」と表示されます。しかし、それを削除すると、connectionStringNameを要求されます。これがそのコードです。

 <!--
        If you are deploying to a cloud environment that has multiple web server instances,
        you should change session state mode from "InProc" to "Custom". In addition,
        change the connection string named "DefaultConnection" to connect to an instance
        of SQL Server (including SQL Azure and SQL  Compact) instead of to SQL Server Express.
  -->
<sessionState mode="Custom" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="WinBoutsConnectionString" />
  </providers>
</sessionState>

誰かが私がどこで間違っているのか教えてもらえますか?任意の提案やアイデアを深くいただければ幸いです。

4

2 に答える 2

2

最終的に問題を解決しました。問題は私の基本認証フィルタークラスにありました。

private bool TryGetPrincipal(string username, string password, out IPrincipal principal)
    {      string connectionString = ConfigurationManager.ConnectionStrings["WinBoutsConnectionString"].ConnectionString;    

        username = username.Trim();
        password = password.Trim();

        //only supporting SSO login atm
       // var valid = Membership.Provider.ValidateUser(username, password);
        serviceContext = new WinBoutsDataContext<DataAccess.Model.UserInfo>(connectionString);
        userRepository = new UserRepository(serviceContext);

        var valid = this.userRepository.ValidateAccount(username, password);

        if (valid)
        {
            // once the user is verified, assign it to an IPrincipal with the identity name and applicable roles
            principal = new GenericPrincipal(new GenericIdentity(username), System.Web.Security.Roles.GetRolesForUser(username));
            return true;
        }

        //user wasn't found, unauthorised
        principal = null;
        return false;
    }

ここでDataContextをハードコーディングしましたが、以前は接続文字列をそこに渡しませんでした。WinBoutsDataContextのデフォルトのコンストラクターを選択しましたが、サーバーにコードを配置したときに機能しませんでした。

于 2012-11-27T08:41:52.980 に答える
1

定義されたconnectionStringを使用する場合は、接続文字列の名前を使用して「sqlConnectionString」属性を入力し、SqlServerモードを使用する必要があります。

<configuration>
  <connectionStrings>
    <add name = "myString"
         connectionString = "data source=local;user id=User;password=password" />
  </connectionStrings>
  <system.web>
    <sessionState
      mode="SQLServer"
      sqlConnectionString="myString"
      cookieless="false"
      timeout="20"
    />
  </system.web>
</configuration>
于 2014-09-16T09:34:13.400 に答える