2011-03-18 236 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

相关问题