Entity Framework «Основной поставщик не удалось открыть» - Кассини против IIS - PullRequest
4 голосов
/ 03 мая 2011

У меня есть служба, которая использует EF для извлечения данных из базы данных SQL.

Модель EF находится в библиотеке классов. В библиотеке классов соединение настроено как:

      <add name="APIC2CEntities"
     connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MYSERVER;initial catalog=MYDB;user id=MYUSER;password=THEPASSWORD;multipleactiveresultsets=True;App=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

На эту библиотеку классов ссылается проект службы WCF. В webconfig я контролирую соединение EF с помощью:

      <add name="APIC2CEntities"
     connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MYSERVER;initial catalog=MYDB;user id=MYUSER;password=THEPASSWORD;multipleactiveresultsets=True;App=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

Когда моя служба работает в Кассини, данные извлекаются правильно. Когда служба работает под управлением IIS (Windows XP), соединение не устанавливается со следующим исключением:

Основной провайдер не удалось открыть Open

с внутренним исключением, говорящим мне:

{"Произошла ошибка, связанная с сетью или конкретным экземпляром, при установлении соединения с SQL Server. Сервер не был найден или недоступен. Убедитесь, что имя экземпляра правильное и что SQL Server настроен на разрешить удаленные подключения. (поставщик: поставщик именованных каналов, ошибка: 40 - не удалось открыть подключение к SQL Server) "}

Я понимаю, что Cassini работает под моей зарегистрированной учетной записью, и что IIS работает под учетной записью IUSR_MYMACHINE, но мое соединение не является доверенным, поэтому не должно иметь значения ...

Как еще можно по-другому манипулировать или контролировать соединение EF между IIS и Cassini?

Спасибо
Mark

Ответы [ 2 ]

3 голосов
/ 04 мая 2011

Наше решение в этом случае состояло в том, чтобы заставить соединение использовать tcp (используя data source=tcp:MyServer в строке подключения) и включить TCP в окне SQL (упс!) ..

Я до сих пор не знаюкак сеанс Cassini смог установить соединение там, где сеанс IIS не был: -S

Mark

0 голосов
/ 07 ноября 2017

Я думаю, что проблема все еще в строке подключения. Если вы уверены, пожалуйста, выполните следующие шаги и протестируйте

  1. Открыть пустой блокнот и сохранить как connectionString.UDL
  2. Открыть connectionString (только что сохраненный в шаге 1)
  3. На вкладке подключения: введите имя сервера (в моем случае: DESKTOP-IDSLV81) или IP как XXX.XXX.XXX.XXX, 1433, где 1433 - порт по умолчанию, используйте соответствующее имя пользователя и пароль и выберите База данных (доступная БД в выпадающем списке)
  4. Затем нажмите тестовое соединение, если все прошло успешно, нажмите кнопку Ok.
  5. Откройте файл connectionString.UDL в блокноте. Там есть правильная строка подключения и сравните ее со строкой подключения в web.config
...