Служба WCF возвращает 400 неверных запросов - PullRequest
4 голосов
/ 19 марта 2011

У меня есть это приложение, которое работает локально и при развертывании и использует файл базы данных SQL Express .mdf (который я обычно использую для целей тестирования). Однако когда я переключаю его на работу с нашим SQL Server 2008, приложение работает, а служба - нет.

Например, если в моем коде позади страницы у меня есть кнопка, которая добавляет данные в таблицу, такую ​​как эта, она отлично работает:

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 Ошибка Bad Request.

Код для 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;
    }

Если вместо запроса к базе данных у меня есть служба, которая просто возвращает статические данные, она работает нормально. Что может привести к тому, что мой сервис не сможет подключиться к базе данных, когда остальная часть кода приложения будет работать?

Ответы [ 3 ]

2 голосов
/ 21 марта 2011

Соединение с базой данных из размещенной службы WCF считается удаленным, поэтому убедитесь, что в строках соединения указан метод аутентификации.Поэтому попробуйте использовать Integrated Security = SSPI в строке подключения, и если это не сработает, убедитесь, что в качестве идентификатора вашего пула приложений задана учетная запись домена, имеющая разрешения на сервере SQL.:)

0 голосов
/ 19 марта 2011

Возможно, вы делаете POST, но служба ожидает GET.

Попробуйте указать, что метод должен быть POST:

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

Другое, что может случиться, это то, что вы используете надежное соединение. Это означает, что контекст безопасности является идентификатором пула приложений (если используются значения по умолчанию). Затем вы будете подключаться к базе данных, используя локальную учетную запись, у которой нет доступа к базе данных на другом компьютере.

Странно то, что на основании сообщения об ошибке это должно быть первое объяснение, а на основании вашего описания это будет второе.

0 голосов
/ 19 марта 2011

Вы, вероятно, не устанавливаете заголовки HTTP точно так, как служба ожидает их или в порядке, в котором они их ожидают.

Вот как я бы отладил это:

  1. Создание быстрого тестового клиента с использованием SvcUtil .exe.
  2. Установить Fiddler , включить его.
  3. Используйте тонкий клиент, чтобы позвонить в службу сервиса.
  4. Используйте ваше веб-приложение для вызова той же сервисной операции
  5. Посмотрите полный HTTP-запрос в Fiddler для каждого запроса. Сравните их. Определите, где ваш AJAX-вызов отличается, и устраните различия, чтобы они соответствовали тому, что использует сгенерированный клиент.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...