WCF не работает под IIS 6.0 - PullRequest
       19

WCF не работает под IIS 6.0

19 голосов
/ 16 января 2009

Попытка запустить службу WCF под IIS 6.

Я создал отображение .svc и aspnet_isapi.dll в соответствии с: http://msdn.microsoft.com/en-us/library/ms752241.aspx

При просмотре страницы Server1.svc я получаю 404.

Я протестировал сайт с простой страницей .aspx, чтобы убедиться, что URL работает, но опять же расширение .svc не работает.

У меня установлен .NET 3.5 с пакетом обновления 1 (SP1), мой web.config ссылается на сборки 3.5, и я не получаю сообщение об ошибке при просмотре страницы .aspx, поэтому, вероятно, он хорошо подбирает эти сборки.

Что может быть не так?

Ответы [ 6 ]

20 голосов
/ 18 января 2009

Скорее всего, расширение .svc не зарегистрировано в IIS как обрабатываемое ASP.NET (WCF).

Попробуйте эти 2 шага (замените Framework на Framework64, если это необходимо):

Перейти к:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\

и затем запустите:

aspnet_regiis -i

Перейти к: C: \ Windows \ Microsoft.NET \ Framework \ v3.0 \ Windows Communication Foundation

и затем выполните:

ServiceModelReg.exe -i
17 голосов
/ 16 мая 2009

В Internet Information Service (IIS) Manager откройте узел с именем Web Service Extension. Убедитесь, что для ASP.NET v2.0.5.0727 установлено значение Разрешено. Я часами искал разные настройки и обнаружил, что для них установлено значение Запрещено. Просто нажмите кнопку Разрешить, чтобы включить ASP.NET.

6 голосов
/ 17 января 2009

Я могу придумать две вещи:

Расширение .svc настроено неправильно (наименее вероятно в соответствии с вашим описанием). Вы можете проверить это сообщение для более подробной информации.

Или ваш веб-сайт имеет несколько заголовков хоста. Чтобы решить эту проблему, вы должны иметь один заголовок узла или использовать фабрику. Вот пример:

namespace MyNamespace
{
    public class MultipleHostServiceFactory : ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            List<Uri> addresses = new List<Uri>();
            addresses.Add(baseAddresses[0]);
            return base.CreateServiceHost(serviceType, addresses.ToArray());
        }
    }
}

Далее необходимо установить фабрику в разметке вашего файла .svc:

<%@ ServiceHost Language="C#" 
                Debug="false" 
                Factory="MyNamespace.MultipleHostServiceFactory" 
                Service="MyNamespace.MyService" 
                CodeBehind="MyService.svc.cs" %>
3 голосов
/ 30 июня 2009

У меня была такая же проблема. В итоге я запустил 64-разрядную версию Windows 2003 Server, и мои сборки были настроены на «Любой процессор». Как только я сменил сборки на x86 и загрузил на сервер, все заработало.

Я не знаю, почему никто не упомянул об этом где-либо еще в 30 темах, о которых я читал, но мой друг рекомендовал мне это, и это сработало как шарм.

Просто выбросить его на случай, если у кого-то возникнет такая же проблема.

0 голосов
/ 18 ноября 2015

Я боролся с этим часами, пока, наконец, не использовал этот пример, и он сработал сначала: http://www.codeproject.com/Articles/105273/Create-RESTful-WCF-Service-API-Step-By-Step-Guide

Я знаю, что только ссылки со ссылками не являются хорошими, и другие использовали эту ссылку CP, чтобы решить эту проблему здесь, в Stackoverflow , поэтому вот основные шаги, если статья когда-либо понижается:

ШАГ 1

Прежде всего, запустите Visual Studio 2010. Нажмите FILE-> NEW-> PROJECT. Создайте новое «Приложение службы WCF».

ШАГ 2

Как только вы создадите проект, вы увидите в решении, что по умолчанию служба WCF и файл интерфейса уже созданы (Service1.cs & IService.cs). Удалите эти два файла, и мы создадим наш собственный интерфейс и файл службы WCF.

ШАГ 3

Теперь щелкните правой кнопкой мыши по решению и создайте один новый файл службы WCF. Я присвоил файлу службы имя «RestServiceImpl.svc».

ШАГ 4

Как я объяснил в начале статьи, что мы будем писать API, который может возвращать данные в формате XML и JSON, вот интерфейс для этого. В IRestServiceImpl добавьте следующий код

В приведенном выше коде вы можете увидеть два разных метода IRestService - XMLData и JSONData. XMLData возвращает результат в XML, тогда как JSONData в JSON.

[ServiceContract]
public interface IRestServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{id}")]
    string XMLData(string id);

    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "json/{id}")]
    string JSONData(string id);
}

ШАГ 5

Откройте файл RestServiceImpl.svc.cs и напишите там следующий код:

public class RestServiceImpl : IRestServiceImpl
{
    public string XMLData(string id)
    {
        return "You requested product " + id;
    }

    public string JSONData(string id)
    {
        return "You requested product " + id;
    }
}

ШАГ 6

Web.Config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="RestService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour">
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address ="" binding="webHttpBinding" contract="RestService.IRestServiceImpl" behaviorConfiguration="web">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
        </endpoint>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

ШАГ 7

В IIS:

enter image description here

0 голосов
/ 16 октября 2013

У меня была та же проблема, и я решил ее, разрешив расширения ISAPI. В диспетчере информационных служб Интернета (IIS) откройте узел, называемый расширением веб-службы. Убедитесь, что для параметра «Все неизвестные расширения ISAPI» установлено значение «Разрешено».

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