Как получить 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.