Я пытаюсь запустить очень простой веб-сервис на том же веб-сайте IIS7, на котором запущено приложение MVC2. Это создает несколько разных проблем, и я считаю, что это связано с моим system.serviceModel, но, очевидно, я не знаю наверняка (или я бы это исправил).
На стороне сервера я могу запустить свой сервис просто отлично, операция справки работает как чудо. Я могу выполнить стандартную операцию WCF GetData и предоставить значение через адресную строку FireFox.
http://localhost/services/service1/getdata?value=3 (пример)
Первая проблема, с которой я столкнулся, заключается в том, что при переходе к URI базовой службы будет отображаться следующее сообщение. Хотя это еще не конец света, потому что я все еще могу выполнять код, манипулируя адресом; Я ожидаю, что что-то еще будет отображаться. Я ожидаю стандартного нового сообщения веб-службы, объясняющего, что, добавив «? Wsdl» к адресу, вы получите автоматически сгенерированный WSDL. Я не могу получить доступ к своему автоматически сгенерированному WSDL.
«Конечная точка не найдена. Пожалуйста, посмотрите
Сервисная страница помощи для построения
действительные запросы к службе. ”
Проблема номер два связана с подключением клиентских приложений к моему веб-сервису. Я создал консольное приложение в отдельном решении Visual Studio и добавил ссылку на веб-сервис на Service1. В инструменте Visual Studio я могу увидеть и использовать два метода, которые существуют в моем сервисе, но когда я запускаю код, я получаю следующее исключение.
InvalidOperationException Не удалось
найти элемент конечной точки по умолчанию, который
контракт ссылок
'ServiceReference1.IService1' в
Конфигурация клиента ServiceModel
раздел. Это может быть потому, что нет
файл конфигурации был найден для вашего
приложение, или потому что нет конечной точки
элемент, соответствующий этому контракту, может
быть найденным в клиентском элементе.
Прежде чем опубликовать свой код (я уверен, что читатели устали читать о моей борьбе), я хочу упомянуть, что мне удалось безупречно запустить приложение библиотеки служб WCF и консоль в одном решении. Кажется, очень мало ресурсов, объясняющих WCF, конфигурацию WCF и работу с MVC. Я прочитал несколько статей, и они либо устарели, либо были настолько просты, что были почти бесполезны (например, нажмите кнопку, чтобы получить веб-сервис с именем «Service1»).
Подводя итог; почему я не могу получить доступ к автоматически сгенерированному WSDL и как я могу успешно подключить мой клиент и использовать веб-сервис? Теперь лучшая часть; код.
Global.asax
//Services section
routes.Add(new ServiceRoute("services/service1", new WebServiceHostFactory(), typeof(Service1)));
Web.Config
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="DefaultEndpoint" helpEnabled="true" automaticFormatSelectionEnabled="true" />
</webHttpEndpoint>
<mexEndpoint />
</standardEndpoints>
<services>
<service name="Project.Services.Service1" behaviorConfiguration="MetadataBehavior">
<!-- Service Endpoints -->
<!-- Unless fully qualified, address is relative to base address supplied above -->
<endpoint endpointConfiguration="DefaultEndpoint" kind="webHttpEndpoint" binding="webHttpBinding" contract="Project.Services.IService1" />
<!-- Metadata Endpoints -->
<!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
<!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MetadataBehavior">
<!-- To avoid disclosing metadata information,
set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="false" /> <!-- httpGetEnabled="true" does not solve the problem either -->
<!-- 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="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
IService1
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method = "GET")]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
// TODO: Add your service operations here
}
Service1
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite == null)
{
throw new ArgumentNullException("composite");
}
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
Клиентская программа
class Program
{
static void Main(string[] args) {
Service1Client client = new Service1Client();
client.GetData(2);
}
}