使用错误连接字符串的移动服务(.Net后端)

时间:2014-04-15 13:54:01

标签: entity-framework azure azure-mobile-services

我正在努力使移动服务的.Net后端使用正确的connectionString。当我发布服务时,我为“MS_TableConnectionString”选择了正确的连接字符串。如果我检查服务器上的web.config(通过FTP),我会看到我的期望:

服务器上的

web.config:

 <connectionStrings>

<add name="MS_TableConnectionString" connectionString="Data Source=tcp:[ServerAddress].database.windows.net,1433;Initial Catalog=[MyMobileService_db];Integrated Security=False;User ID=[correctUserName];Password=[CorrectPassword];Connect Timeout=30;Encrypt=True" providerName="System.Data.SqlClient" />

在我的上下文中,它被配置为使用名为MS_TableConnectionString的连接字符串:

    private const string connectionStringName = "Name=MS_TableConnectionString";

    public MyMobileServiceContext() : base(connectionStringName)
    {
        Schema = "MyMobileService";
    } 

要查看实际使用的连接字符串,我将其添加到示例控制器:

示例客户端代码:

public class ExampleController : ApiController
{

    MyMobileServiceContext context;

    public ApiServices ApiServices { get; set; }

    public ExampleController()
    {
        context = new MyMobileServiceContext();
    }


    public async Task<IHttpActionResult> PostExample(ExampleItem item)
    {
        ApiServices.Log.Warn("ConnectionString: " + context.Database.Connection.ConnectionString);
       ...

    }

当我查看移动服务上的日志条目时,我看到了不同的用户名和密码:

[2014-04-15T12:26:33.1410580Z] Level = Warn,Kind = Trace,Category ='PostExampleItem',Id = 00000000-0000-0000-0000-000000000000,Message ='ConnectionString:Data Source = [ SameServerAddress] .database.windows.net; Initial Catalog = [SameDatabaseName]; User ID = [DifferentUserName]; Password = [DifferentPassword]; Asynchronous Processing = True; TrustServerCertificate = False;'

不同的用户名和密码与我在SQLServerDBConnectionString名下下载的原始.PublishSettings文件中看到的相同,但我不知道它存储在服务器上的哪个位置?

由于用户名和密码不同,我在日志中看到以下异常:

[2014-04-15T13:18:11.2007511Z] Level = Error,Kind = Trace,Category ='App.Request',Id = d7ec6d25-f3b7-4e88-9024-217be40ae77f,Exception = System.Data.Entity .Core.ProviderIncompatibleException:访问数据库时发生错误。这通常意味着与数据库的连接失败。检查连接字符串是否正确,以及是否使用了相应的DbContext构造函数来指定它或在应用程序的配置文件中找到它。有关DbContext和连接的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=386386。有关失败的详细信息,请参阅内部异常。 ---&GT; System.Data.Entity.Core.ProviderIncompatibleException:提供程序未返回ProviderManifestToken字符串。 ---&GT; System.Data.SqlClient.SqlException:无法打开登录请求的数据库“master”。登录失败。 用户'[DifferentUserName]'登录失败。 已为此会话分配了“[GUID]”的跟踪ID。在需要帮助时,请将此跟踪ID提供给客户支持。

任何帮助都会非常感激,因为目前我不得不在Context的构造函数中对整个连接字符串进行硬编码以使其正常工作。

由于

˚F

更新:2014年4月15日15:23

我删除了所有发布商个人资料,并创建了原始.PublishSettings文件的副本。从这里我删除了除一个配置文件以外然后我删除了SQLDBConnectionString属性以确认它不是因为我发送的是导致问题的原因。结果没有变化,它仍然使用DifferentUserName和Password,所以它必须从服务器的某个地方读取它。

1 个答案:

答案 0 :(得分:0)

我们目前有一个漏洞,我们从门户网站获取连接字符串,但不公开在那里设置或修改连接字符串的能力。

解决方法是在门户中设置应用程序设置,然后使用ApiServices类在代码中使用它,就像这样(在你的控制器中)

    string connectionString = this.Services.Settings["YourConnectionStringAsAppSetting"];

我知道这让人感到困惑......我们会更容易访问和修改连接字符串。

的Henrik