WCF IIS SQL проблема - PullRequest
       3

WCF IIS SQL проблема

1 голос
/ 08 апреля 2011

У меня есть локальный сервер IIS, локальный сервер SQL и служба тестирования WCF с тремя методами интерфейса:

[OperationContract]
string GetData(int value);

[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);

[OperationContract]
string getFirstName(); 

Первые два - это шаблон VS, и я добавил getFirstName() метод

{
   //very basic 
   string connectionString = @"Data Source=.\SqlExpress;Initial Catalog=ProjectDB;Integrated Security=True";

   SqlConnection con = new SqlConnection(connectionString);
   con.Open();

   SqlCommand command = new SqlCommand("select * from messages;", con);

   DataTable table = new DataTable();

   SqlDataAdapter adapter = new SqlDataAdapter(command);
   adapter.Fill(table);

   con.close();

   return table.Rows[0][3].ToString();
}

Когда я тестирую вызов на тестовом клиенте WCF VS, все методы работают так, как должны.

Когда служба публикуется в локальном IIS с помощью мастера VS (публикация -> Локальный IIS -> Сайт MyTestWeb), я получаю сообщение об ошибке при попытке вызвать getFirstName() (методом проверки подлинности SQL является проверка подлинности Windows).

Другие методы:

CompositeType GetDataUsingDataContract(CompositeType composite); 

и

string GetData(int value);

отлично работает как на сервере разработки VS, так и на локальном сервере IIS.

Спасибо.

Ответы [ 4 ]

1 голос
/ 06 августа 2012

В дальнейшем при извлечении одного значения из серверной части наиболее подходящим методом, вероятно, будет «ExecuteScalar», который специально разработан для задачи, как следует из названия.

0 голосов
/ 08 апреля 2011

Да, это, вероятно, разрешения. Убедитесь, что пользователь, на котором работает ваш сайт, имеет права доступа к базе данных SQL Server, например NT Authority \ SYSTEM (это будет зависеть от вашей версии IIS).

0 голосов
/ 08 апреля 2011

Скорее всего, ваша ошибка возникает из-за того, что вы подключаетесь к SQL Server Express с использованием встроенной системы безопасности, а в IIS это означает, что удостоверение работает под управлением IIS, и эта учетная запись, скорее всего, не будет разрешена на вашем экземпляре SQL Server.

Еще одна рекомендация: вы должны улучшить свой код ADO.NET!

  • используйте using(.....) { .... } блоки для защиты ваших одноразовых объектов ( особенно важно в среде WCF!)

  • не создавайте SqlDataAdapter и DataTable только для чтения значения одного столбца ......

Моя рекомендация будет примерно такой:

public string GetFirstName()
{
   string firstName = string.Empty;

   string connectionString = @"Data Source=.\SqlExpress;Initial Catalog=ProjectDB;Integrated Security=True";

   using(SqlConnection con = new SqlConnection(connectionString))
   using(SqlCommand command = new SqlCommand("SELECT FirstName FROM dbo.Messages", con))
   {
       con.Open();

       using(SqlDataReader rdr = command.ExecuteReader())
       {
          if(rdr.Read())
          {
             firstName = rdr.GetString(0); // read column no. 0
          }

          rdr.Close();
       }

       con.close();
   }

   return firstName;
}

Это не решает вашу текущую проблему, но может помочь вам избежать будущих (и их трудно найти / отследить)!

0 голосов
/ 08 апреля 2011

Посмотрите на мой ответ на этот вопрос: Служба WCF работает в Кассини, но не в IIS

Похоже, у вас та же проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...