Как получить WSDL/ описание, чтобы я мог добавить WebReference в другой проект?

Я знаю, как добавить WebReference в Visual Studio, достаточно просто.

Я также знаю, как создать обычный проект веб-службы ASP.NET, но это не то, что я делаю здесь.

Итак, WebService, который я использую, выглядит так:

try
{
    if (host != null)
    {
         host.Close();
         host = null;
    }
    baseAddress = new Uri("http://mysite.com:8080");
    host = new WebServiceHost(typeof(MyProxy), baseAddress);

    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
    smb.HttpGetEnabled = true;
    host.Description.Behaviors.Add(smb);

    host.Opened += new EventHandler(host_Opened);
    host.Closed += new EventHandler(host_Closed);

    System.ServiceModel.Description.ServiceEndpoint se = host.AddServiceEndpoint(typeof(IMyProxy), new WebHttpBinding(), baseAddress);
    se.Behaviors.Add(new System.ServiceModel.Description.WebHttpBehavior());
    host.Open();
 }
 catch (Exception e)
 {
 }

 // .... stuff ....

[ServiceContract]
public interface IMyProxy
{
    [OperationContract]
    [WebGet(UriTemplate = "GetArea?searchString={searchString}")]
    GetAreaResult GetArea(string searchString);
}

// more stuff of course follows here

Проблема в том, что когда я пытаюсь добавить WebReference к вышеуказанному сервису в Visual Studio, я получаю сообщение об ошибке.

"Добавить сервисную ссылку" -> "Добавить веб-ссылку" и в URL-адресе я пишу свой URL, http://mysite.com:8080/

Затем я получаю "Сервис... Конечная точка не найдена". и сообщение об ошибке в поле Добавить веб-ссылку:

Произошла ошибка при загрузке "http://mysite.com:8080/". Запрос не выполнен с состоянием HTTP 404: не найдено. Произошла ошибка при загрузке "http://mysite.com:8080/$metadata". Запрос не выполнен с состоянием HTTP 404: не найдено.

Если я открою веб-браузер и сразу зайду на http://mysite.com:8080/GetArea служба будет вызываться / выполняться, как и ожидалось.

Короче, перефразирую проблему: WSDL/description не существует, поэтому я не могу добавить ссылку на веб-сервис.

3 ответа

Проблема здесь в том, что WebServiceHost удалит функциональность, которую вы пытаетесь достичь при добавлении ServiceMetadataBehavior, Глядя в dotPeek (отражатель) на WebServiceHost, внутри OnOpening метод есть:

ServiceDebugBehavior serviceDebugBehavior = this.Description.Behaviors.Find<ServiceDebugBehavior>();
  if (serviceDebugBehavior != null)
  {
    serviceDebugBehavior.HttpHelpPageEnabled = false;
    serviceDebugBehavior.HttpsHelpPageEnabled = false;
  }
  ServiceMetadataBehavior metadataBehavior = this.Description.Behaviors.Find<ServiceMetadataBehavior>();
  if (metadataBehavior != null)
  {
    metadataBehavior.HttpGetEnabled = false;
    metadataBehavior.HttpsGetEnabled = false;
  }

WebServiceHost предназначен для использования со службами REST/JSON, которые обычно не имеют определенного контракта, поэтому метаданные (mex) отключены.

Если вы пытаетесь создать службу на основе SOAP, вам нужно использовать стандартную ServiceHost, Похоже, это то, что вы хотите, так как вы пытаетесь добавить ссылку на службу через VS.

Если вы пытаетесь создать службу REST/JSON, вы можете использовать WebServiceHost,

Вам потребуется ServiceMetadataBehavior, добавленный к хосту, см. MSDN Reference.

// Enable Mex
host.Description.Behaviors.Add(new ServiceMetadataBehavior{ HttpGetEnabled = true });

Я думаю, что вам нужно создать WSDL или диско-файл для вашего веб-сервиса. Для этого запустите ваш веб-сервис локально, как вы сказали, что он работает нормально. В моем случае, когда я запускаю свой веб-сервис, я получаю ссылку в верхней части моей страницы как "Описание службы" . Msgstr "" . Когда вы нажмете здесь, вы получите файл WSDL в браузере. Другой способ - добавить "? Wsdl" в конце строки запроса. Вы получите ваш файл wsdl.

Другие вопросы по тегам