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

답변

2

호스트 된 WCF 서비스의 데이터베이스 연결은 원격 연결로 간주되므로 연결 문자열에 인증 방법이 지정되어 있는지 확인하십시오. 따라서 연결 문자열에 Integrated Security = SSPI를 사용해보십시오. 작동하지 않는 경우 응용 프로그램 풀의 ID가 SQL 서버에 대한 사용 권한이있는 도메인 계정으로 설정되어 있는지 확인하십시오.:)

+1

Sweeeeeeet! 그게 내 DBA가 연결하려고 할 때 오류 로그를 확인했다 예 : '로그인 사용자 'DOMAIN \ 사용자'실패했습니다. 이유 : SQL Server 인증에서 NT 계정 이름을 사용하려고 시도했습니다. ' SSPI로 변경하면 SQL Server를 로컬로 테스트 할 때 작동하지만 서버에서는 여전히 작동하지 않습니다. DBA는 오류가 이제는 다르다고 언급했습니다. 'DOMAIN \ server1 $ '사용자가 로그인하지 못했습니다. 이유 : 토큰 기반 서버 액세스 유효성 검사가 인프라 오류로 인해 실패했습니다. 이전 오류를 확인하십시오. ' 신원을 변경 했으니 이제는 모두 좋았습니다! 감사! – LanFeusT

0

서비스에서 기대하는대로 또는 기대하는 순서대로 HTTP 헤더를 정확하게 설정하지 않았을 수 있습니다. 여기

내가 그것을 디버깅 줄 방법은 다음과 같습니다

  1. SvcUtil .EXE를 사용하여 빠른 테스트 클라이언트를 만듭니다.
  2. Fiddler을 설치하고 전원을 켜십시오.
  3. 씬 클라이언트를 사용하여 서비스 작업을 호출하십시오.
  4. 웹 응용 프로그램을 사용하여 동일한 서비스 작업을 호출하십시오.
  5. 각 요청에 대해 Fiddler에서 전체 HTTP 요청을보십시오. 그들을 비교하십시오. AJAX 호출이 다른 곳을 찾아낸 다음 차이점을 분석하여 생성 된 클라이언트가 사용하는 것과 일치하도록합니다.
+0

왜 로컬에서 작동하고 SQL Express .mdf 데이터베이스 파일을 사용할 때? – LanFeusT

0

POST를하고 있지만 서비스가 GET을 기대할 수 있습니다.

하는 방법은 POST해야한다고 지정보십시오 : 그것은있을 수

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

다른이 있다는 것은 당신이 신뢰할 수있는 연결을 사용하는 것입니다. 즉, 보안 컨텍스트는 응용 프로그램 풀의 ID입니다 (기본값이 사용되는 경우). 그런 다음 다른 시스템의 데이터베이스에 액세스 할 수없는 로컬 계정을 사용하여 데이터베이스에 연결합니다.

이상한 점은 오류 메시지를 기반으로하는 첫 번째 설명이되어야하지만 설명에 따르면 두 번째 것입니다.

+0

그건 작동하지 않았다. 연결 문자열에 사용자 이름/암호를 지정하려고 시도했지만 변경 사항이 없습니다. 나는 [something] (http://dbaspot.com/forums/sqlserver-server/421305-wcf-service-sql-server-connection-issue.html)에서 불행하게도이 오류에 관해 도움을 얻지 못했습니다. 내 DBA는 포트 1449에서 사용할 수 있어야하지만 내 연결 문자열을 변경하여 일치하지 않는 것으로 알려줍니다. – LanFeusT

+0

기본 포트는 1433입니다. 따라서 데이터베이스를 다른 포트에 지정해야 할 경우 일반적으로 SQL 별칭을 만들어이 포트를 지정합니다. 코드에서 오류를 기록하고 이벤트 로그를 확인하십시오. –

관련 문제