WCF, MVC2, получение доступа к автоматически сгенерированному WSDL и работа через конечную точку по умолчанию не найдены - PullRequest
1 голос
/ 03 мая 2011

Я пытаюсь запустить очень простой веб-сервис на том же веб-сайте 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);
    }
}

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Спасибо за помощь!Проблема была внутри моего Global.asax.cs.

Оригинал:

routes.Add(new ServiceRoute("services/service1", new WebServiceHostFactory(), typeof(Service1)));

Новый:

routes.Add(new ServiceRoute("services/service1", new ServiceHostFactory(), typeof(Service1)));

Разница заключалась в том, что фабрика хостов переходила от "WebServiceHostFactory" к "ServiceHostFactory".

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

Чтобы не вводить вручную конфигурацию клиента, мне пришлось изменить конечную точку

Оригинал

<endpoint endpointConfiguration="DefaultEndpoint" kind="webHttpEndpoint" binding="webHttpBinding" contract="Project.Services.IService1" /> 

Новый

<endpoint binding="wsHttpBinding" contract="Project.Services.IService1" />

После внесения этого изменения служба и клиент работают безупречно.

0 голосов
/ 03 мая 2011

Быстрый ответ на один из ваших вопросов:

Подведем итог;почему я не могу получить доступ к автоматически сгенерированному WSDLпо http. Вы должны указать WCF генерировать метаданные службы , а вы запретили.

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