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

Я знаю, как добавить веб-ссылку в 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 ]

3 голосов
/ 15 сентября 2011

Проблема в том, что 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.

1 голос
/ 16 августа 2011

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

// Enable Mex
host.Description.Behaviors.Add(new ServiceMetadataBehavior{ HttpGetEnabled = true });
0 голосов
/ 13 декабря 2011

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

...