2011-03-18 234 views
4

我有這個應用程序可以在本地工作,並在部署和使用.mdf SQL Express數據庫文件(我通常用於測試目的)時使用。但是,當我將其更改爲使用SQL Server 2008時,該應用程序可以正常工作,但該服務不會。WCF服務返回400錯誤請求

例如,如果在一個頁面中我有一個按鈕,將數據添加到表的後面我的代碼,例如這樣正常工作:

public static string connString = @"Data Source=server1;Initial Catalog=Project;Integrated Security=True"; 

protected void btnAddProj_Click(object sender, EventArgs e) 
{ 
    using (var sqlc = new SqlConnection(connString)) 
    { 
     sqlc.Open(); 
     var cmd = sqlc.CreateCommand(); 
     int intProjectID; 

     // Add the project info to the database 
     cmd.CommandText = "INSERT INTO tblProject VALUES(@ProjName,@ProjTeam,@ProjStart,@ProjEnd)"; 
     cmd.Parameters.Add("ProjName", System.Data.SqlDbType.NVarChar).Value = txtProjName.Text; 
     cmd.Parameters.Add("ProjTeam", System.Data.SqlDbType.Int).Value = ddlTeamSupported.SelectedValue; 
     cmd.Parameters.Add("ProjStart", System.Data.SqlDbType.NVarChar).Value = txtStartDate.Text; 
     cmd.Parameters.Add("ProjEnd", System.Data.SqlDbType.NVarChar).Value = txtEndDate.Text; 
     cmd.ExecuteNonQuery(); 
    }  
} 

我的web.config是設置爲使用模擬該服務器上並且一切都很好。但是,對於我的服務,查詢似乎沒有返回任何內容,並且出現400錯誤請求錯誤。

爲jQuery的代碼是:

$.ajax({ 
    type: "POST", 
    async: false, 
    url: "Services/ProjectService.svc/test", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (data) { 
     console.log(data); 
     } 
    }); 

而對於服務:

[ServiceContract] 
public interface IProjectService 
{ 
    [OperationContract] 
    [WebInvoke(ResponseFormat = WebMessageFormat.Json)] 
    ArrayList test(); 
} 


    public static string connString = @"Data Source=server1;Initial Catalog=Project;Integrated Security=True"; 

    public ArrayList test() 
    { 
     var sqlc = new SqlConnection(connString); 
     sqlc.Open(); 
     var cmd = sqlc.CreateCommand(); 
     cmd.CommandText = "SELECT ProjectID FROM tblProject"; 
     var reader = cmd.ExecuteReader(); 

     ArrayList temparray = new ArrayList(); 


     while (reader.Read()) 
     { 
      temparray.Add(reader[0]); 
     } 
     sqlc.Close(); 
     return temparray; 
    } 

如果不是查詢數據庫我有服務僅返回靜態數據,然後它工作正常。 什麼可能導致我的服務無法連接到數據庫,當應用程序的其餘代碼工作?

+0

當您調試服務時它會拋出任何錯誤嗎? – Marcus 2011-03-18 21:40:32

回答

2

來自託管WCF服務的數據庫連接被認爲是遠程連接,因此請確保您的連接字符串指定了身份驗證方法。因此,請嘗試在連接字符串中使用Integrated Security = SSPI,如果不起作用,請確保您的應用程序池標識設置爲對SQL服務器具有權限的域帳戶。:)

+1

Sweeeeeeet!這工作是的,讓我的DBA檢查錯誤日誌時試圖連接,我有: 登錄失敗的用戶'DOMAIN \用戶'。原因:試圖在SQL Server身份驗證中使用NT帳戶名稱.' 當我更改爲SSPI時,它在本地進行測試但使用SQL Server時起作用,但在服務器上仍然無效。 DBA提到現在的錯誤不同: '用戶'DOMAIN \ server1 $'登錄失敗。原因:基於令牌的服務器訪問驗證因基礎結構錯誤而失敗。檢查以前的錯誤。' 我改變了身份,現在都很好!謝謝! – LanFeusT 2011-03-21 17:58:45

0

您可能沒有完全按照服務期望的那樣設置HTTP標頭,或者按照期望它們的順序。

這裏是如何我調試它:

  1. 創建使用SvcUtil的.exe快速測試客戶端。
  2. 安裝Fiddler,將其打開。
  3. 使用瘦客戶端撥打服務操作。
  4. 使用您的Web應用程序撥打相同的服務操作
  5. 查看每個請求的Fiddler中的完整HTTP請求。比較它們。找出您的AJAX調用不同的地方,並解決差異,以便它與生成的客戶端使用的匹配。
+0

爲什麼它會在本地工作,並在使用SQL Express .mdf數據庫文件時使用? – LanFeusT 2011-03-19 00:54:23

0

這可能是你正在發一個POST,但該服務期待一個GET。

嘗試指定的方法應該是POST:

[WebInvoke(Method = "POST", UriTemplate = "", ResponseFormat = WebMessageFormat.Json)] 

其他這一點,它可以是您正在使用受信任的連接。這意味着安全上下文是應用程序池的標識(如果使用默認值)。然後,您將使用無法訪問不同計算機上的數據庫的本地帳戶連接到數據庫。

奇怪的是,根據錯誤信息它應該是第一個解釋,但根據您的描述它將是第二個。

+0

這沒有奏效。我試着在連接字符串中指定用戶名/密碼,但沒有更改。 我發現[某事](http://dbaspot.com/forums/sqlserver-server/421305-wcf-service-sql-server-connection-issue.html)不幸的是,這並沒有幫助。我的DBA告訴我它應該在1449端口可用,但改變我的連接字符串以匹配那也沒有工作。 – LanFeusT 2011-03-19 00:56:08

+0

默認的端口是1433,所以如果你的數據庫位於不同的數據庫上,它需要指定,我們通常通過創建一個sql別名來實現。嘗試在代碼中記錄錯誤並檢查事件日誌。 – 2011-03-19 15:37:21

相關問題