Развертывание учебного приложения WCF на IIS7: "Тип не найден"
Я пытался следовать этому руководству для развертывания образца 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.
Интересно, что если я нажимаю на View Applications, создается впечатление, что виртуальный каталог - это приложение (см. Изображение ниже)... хотя, согласно сообщению об ошибке выше, оно не работает.
Это приложение или нет? 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 ответа
Ну, кажется, я получил это на работу. Я все еще не могу найти элемент "Создать приложение" в диспетчере 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. Однако, когда я запустил клиент, я получил сообщение об ошибке "Вызывающий не был аутентифицирован службой". Решение этой проблемы было самым простым: просто измените binding="wsHttpBinding" на binding="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>
Чтобы создать новое приложение, щелкните правой кнопкой мыши узел "Веб-сайт по умолчанию". В контекстном меню выберите "Добавить приложение".
У меня была та же ошибка, и для меня проблема была просто в том, что на сервере отсутствовали сборки, которые требовались сервису для компиляции.
Все, что здесь описано, мне не нужно.
Чтобы выяснить, в чем ваша ошибка, вы можете попробовать переместить файлы service.svc и service.svc.cs в каталог App_Code. Таким образом, вы получите сообщение об ошибке, лучше относящееся к вашей реальной ошибке.
В моем случае это пространство имен, которое отсутствовало, потому что я забыл развернуть некоторые сборки. Я загрузил недостающие сборки, правильно запустил службу, затем переместил обратно файлы служб, где они были.
У меня была эта проблема.
- Я держал опубликованные файлы под wwwroot
- Нажмите Обзор файла.svc.
- Это исключение
разрешение
- Я создал виртуальный каталог для того же
- Пытается просмотреть файл.svc.
За работой...