Развертывание учебного приложения WCF на IIS7: «Тип не найден» - PullRequest
12 голосов
/ 29 апреля 2010

Я пытался следовать этому учебнику для развертывания образца WCF в IIS. Я не могу заставить его работать. Это размещенный сайт, но у меня есть доступ IIS Manager к серверу. Однако на шаге 2 учебника я не могу «создать новое приложение IIS, которое физически находится в этом каталоге приложений». Я не могу найти пункт меню, пункт контекстного меню, или что-то, что не создать новое приложение. Я везде щелкал правой кнопкой мыши, как сумасшедший, и до сих пор не могу понять, как создать новое приложение. Я предполагаю, что это, вероятно, коренная проблема, но я попробовал несколько других вещей (описанных ниже) на случай, если это на самом деле не проблема. Вот изображение того, что я вижу в IIS Manager, если мои слова не соответствуют действительности:

Не добавлять приложение здесь http://www.freeimagehosting.net/uploads/d6edbaaf3c.png

Это "развернуто" в http://test.com.cws1.my -hosting-panel.com / IISHostedCalcService / Service.svc . Ошибка говорит:

    The type 'Microsoft.ServiceModel.Samples.CalculatorService', 
provided as the Service attribute value in the ServiceHost directive, 
or provided in the configuration element
 system.serviceModel/serviceHostingEnvironment/serviceActivations 
could not be found.

Я также попытался создать виртуальный каталог (IISHostedCalc) в dotnetpanel, который указывает на IISHostedCalcService. Когда я перехожу на http://test.com.cws1.my -hosting-panel.com / IISHostedCalc / Service.svc , возникает другая ошибка:

This collection already contains an address with scheme http.  
There can be at most one address per scheme in this collection.

Интересно, что если я нажимаю на Просмотр приложений, создается впечатление, что виртуальный каталог - это приложение (см. Изображение ниже) ... хотя, согласно сообщению об ошибке выше, оно не работает.

Это приложение или нет? http://www.freeimagehosting.net/uploads/f3230be046.png

Согласно руководству, компиляции не было; Я просто сбросил файлы на сервере, как указано в папке IISHostedCalcService:

service.svc
Web.config
<dir: App_Code>
   Service.cs

service.svc содержит:

<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>

(я пробовал с кавычками вокруг атрибута c #, так как без кавычек это выглядит немного странно, но без разницы)

Web.config содержит:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Microsoft.ServiceModel.Samples.CalculatorService">

        <!-- This endpoint is exposed at the base address provided by host:                                        http://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />

        <!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex -->
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <customErrors mode="Off"/>
  </system.web>
</configuration>

Service.cs содержит:

using System;
using System.ServiceModel;

namespace Microsoft.ServiceModel.Samples
{

    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }


    public class CalculatorService : ICalculator
    {
        public double Add(double n1, double n2)
        {
            return n1 + n2;
        }
        public double Subtract(double n1, double n2)
        {
            return n1 - n2;
        }
        public double Multiply(double n1, double n2)
        {
            return n1 * n2;
        }
        public double Divide(double n1, double n2)
        {
            return n1 / n2;
        }
    }
}

Ответы [ 4 ]

7 голосов
/ 30 апреля 2010

Ну, похоже, я заставил это работать. Я все еще не могу найти пункт «Создать приложение» в диспетчере IIS. Эта часть расстраивает, но я рад, что она все равно работает.

Мне пришлось создать физический каталог IISHostedCalcService под wwwroot. Это создавало некоторую путаницу; это означало, что http://test.com.cws1.my -hosting-panel.com / IISHostedCalcService / Service.svc почти работал, но не должен. Я переместил IISHostedCalcService за пределы wwwroot, и теперь единственное место для доступа к сервису - http://test.com.cws1.my -hosting-panel.com / IISHostedCalc / Service.svc .

Затем при доступе к http://test.com.cws1.my -hosting-panel.com / IISHostedCalc / Service.svc выдает «Эта коллекция уже содержит адрес со схемой http.
В этой коллекции может быть не более одного адреса на схему. "Ошибка. Оказывается, решение этой проблемы заключается в добавлении следующего в файл web.config, прямо под system.serviceModel:

<serviceHostingEnvironment>
  <baseAddressPrefixFilters>
    <add prefix="http://test.com.cws1.my-hosting-panel.com"/>
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

После этого я получил новую ошибку при обработке http://test.com.cws1.my -hosting-panel.com / IISHostedCalc / Service.svc : «Не найдено имя контракта IMetadataExchange в списке контрактов, реализованных Сервис "Калькулятор Сервис". Оказывается, решение этой проблемы состоит в том, чтобы изменить файл web.config следующим образом (то есть добавить раздел поведения и поведениеConfiguration = "SimpleServiceBehavior" в элементе службы):

<configuration>
  <system.serviceModel>
    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="http://test.com.cws1.my-hosting-panel.com"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <services>
      <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="SimpleServiceBehavior">
      ...
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.web>
    <customErrors mode="Off"/>
  </system.web>
</configuration>

Наконец, я смог создать клиентские прокси, указав svcutil на http://test.com.cws1.my -hosting-panel.com / IISHostedCalc / service.svc? Wsdl на шаге 5c учебника на http://msdn.microsoft.com/en-us/library/ms733133.aspx. Однако, когда я запустил клиент, я получил сообщение об ошибке «Звонящий не был аутентифицирован службой». Решение этой проблемы было самым простым: просто измените связывание = "wsHttpBinding" на связывание = "basicHttpBinding" в web.config службы и web.config клиента (или перезапустите svcutil после изменения web.config службы).

Файл web.config в итоге выглядел так:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <serviceHostingEnvironment>
      <baseAddressPrefixFilters>
        <add prefix="http://test.com.cws1.my-hosting-panel.com"/>
      </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <services>
      <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="SimpleServiceBehavior">

        <!-- This endpoint is exposed at the base address provided by host:                                        http://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
                  binding="basicHttpBinding"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />

        <!-- The mex endpoint is explosed at http://localhost/servicemodelsamples/service.svc/mex -->            
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />

      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SimpleServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" />
          <!-- 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>
    </behaviors>
  </system.serviceModel>
  <system.web>
    <customErrors mode="Off"/>
  </system.web>
</configuration>
4 голосов
/ 26 августа 2010

Чтобы создать новое приложение, щелкните правой кнопкой мыши узел «Веб-сайт по умолчанию». В контекстном меню выберите «Добавить приложение».

1 голос
/ 13 января 2012

У меня была эта проблема.

  1. Я держал опубликованные файлы под wwwroot
  2. Нажмите Обзор файла .svc
  3. Это бросание же исключение

Разрешение

  1. Я создал виртуальный каталог для того же
  2. Пытается просмотреть файл .svc.

Рабочая ...

1 голос
/ 22 июля 2011

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

Все, что здесь описано, мне не было нужно.1003 *

Чтобы выяснить, в чем ваша ошибка, вы можете попробовать переместить файлы service.svc и service.svc.cs в каталог App_Code.Таким образом, вы получите сообщение об ошибке, лучше относящееся к вашей реальной ошибке.

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

...