C# WCF服务返回400个错误请求
我有一个在本地工作的应用程序,它可以在部署和使用.mdf SQL Express数据库文件时工作(我通常用于测试目的)。但是,当我将其改为与我们的SQL Server 2008配合使用时,该应用程序可以工作,但服务无法工作 例如,如果在页面的“代码隐藏”中有一个按钮,可将数据添加到如下表中,则效果良好:C# WCF服务返回400个错误请求,c#,asp.net,ajax,wcf,C#,Asp.net,Ajax,Wcf,我有一个在本地工作的应用程序,它可以在部署和使用.mdf SQL Express数据库文件时工作(我通常用于测试目的)。但是,当我将其改为与我们的SQL Server 2008配合使用时,该应用程序可以工作,但服务无法工作 例如,如果在页面的“代码隐藏”中有一个按钮,可将数据添加到如下表中,则效果良好: public static string connString = @"Data Source=server1;Initial Catalog=Project;Integrated Securi
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();
}
}
My 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;
}
如果我没有查询数据库,而是让服务返回静态数据,那么它可以正常工作。
当应用程序的其余代码正常工作时,是什么原因导致我的服务无法连接到数据库?您可能没有按照服务所期望的顺序或顺序设置HTTP头 下面是我调试它的方法:
这可能是因为您正在发帖子,但服务部门希望得到一个GET 尝试指定该方法应为POST:
[WebInvoke(Method = "POST", UriTemplate = "", ResponseFormat = WebMessageFormat.Json)]
另一种可能是您使用的是可信连接。这意味着安全上下文是应用程序池的标识(如果使用默认值)。然后,您将使用一个本地帐户与数据库建立连接,该帐户无法访问另一台计算机上的数据库
奇怪的是,根据错误消息,它应该是第一个解释,但根据您的描述,它将是第二个解释 来自托管WCF服务的数据库连接被视为远程连接,因此请确保连接字符串指定了身份验证方法。因此,请尝试在连接字符串中使用Integrated Security=SSPI,如果不起作用,请确保将应用程序池的标识设置为在SQL server上具有权限的域帐户。:) 调试服务时它是否会抛出任何错误?为什么它会在本地工作以及使用SQL Express.mdf数据库文件时工作?这不起作用。我尝试在连接字符串中指定用户名/密码,但没有更改。不幸的是,我发现这个错误也没有帮助。我的DBA告诉我,它应该在端口1449上可用,但将连接字符串更改为匹配也不起作用。默认端口为1433,因此,如果您的数据库位于其他端口上,则需要指定它,我们通常通过创建sql别名来执行此操作。尝试在代码中记录错误并检查事件日志。sweeeeet!是的,我的DBA在尝试连接时检查了错误日志,我发现:
用户“域\用户”登录失败。原因:尝试将NT帐户名与SQL Server身份验证一起使用。
当我更改为SSPI时,它在本地测试时起作用,但使用SQL Server,但在服务器上仍然不起作用。DBA提到错误现在不同了:用户'DOMAIN\server1$'登录失败。原因:基于令牌的服务器访问验证失败,出现基础结构错误。检查以前的错误。
我更改了身份,现在一切都好了!谢谢