2014-04-15 37 views
0

我努力使移動服務的.Net後端使用正確的connectionString。當我發佈服務時,我爲「MS_TableConnectionString」選擇正確的連接字符串。如果我檢查服務器(通過FTP)在web.config中我看到了我所期望的:服務器使用不正確的連接字符串的移動服務(.Net後端)

的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]級別= 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;'

不同的用戶名和密碼與我在原來的.PublishSettings文件中看到的相同,我用SQLServerDBConnectionString的名稱下載了該文件,但我不知道它存儲在服務器上的位置?

因爲不同的用戶名和密碼我看到在日誌中以下異常的:

[2014-04-15T13:18:11.2007511Z]級別=錯誤,類=跟蹤,類別='App.Request ',Id = d7ec6d25-f3b7-4e88-9024-217be40ae77f,Exception = System.Data.Entity.Core.ProviderIncompatibleException:訪問數據庫時發生錯誤。這通常意味着與數據庫的連接失敗。檢查連接字符串是否正確,並且正在使用適當的DbContext構造函數來指定它或在應用程序的配置文件中找到它。有關DbContext和連接的信息,請參閱http://go.microsoft.com/fwlink/?LinkId=386386。有關失敗的詳細信息,請參閱內部例外。 ---> System.Data.Entity.Core.ProviderIncompatibleException:提供程序沒有返回ProviderManifestToken字符串。 ---> System.Data.SqlClient.SqlException:無法打開登錄請求的數據庫「master」。登錄失敗。 用戶'[DifferentUserName]'登錄失敗。 此會話已被分配了一個跟蹤ID'[GUID]'。當您需要幫助時,將此跟蹤ID提供給客戶支持。

任何幫助將不勝感激,因爲此刻我不得不在上下文的構造函數中編寫整個連接字符串以使其工作。

感謝

˚F

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

我刪除了所有的出版商配置文件和創建的原始.PublishSettings文件的副本。從這我刪除所有,但一個配置文件。然後我刪除了SQLDBConnectionString屬性,以確認它不是因爲我發送了導致問題的原因。結果沒有改變,它仍然使用DifferentUserName和Password,所以它必須從服務器的某處讀取它。

回答

0

我們現在有一個漏洞,因爲我們從門戶網站獲取連接字符串,但沒有公開提供設置或修改連接字符串的能力。

的解決辦法是設置在門戶網站的應用程序設置,然後使用在代碼中使用的ApiServices類,像這樣(在你的控制器)

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

我知道這是令人困惑的。 ..我們將更容易訪問和修改連接字符串。

Henrik

+0

嗨Henrik,感謝您的快速反應和建議。我現在將執行該操作。 – Fletch

相關問題