Невозможно добавить ссылку на службу для собственной службы WCF - PullRequest
2 голосов
/ 30 ноября 2010

Я создал веб-сервис REST, который мне нужно использовать из приложения asp.net. Служба размещается из окна консоли. Я могу заставить его работать нормально, и я могу получить вывод от него, а также при серфинге к нему в веб-браузере. Проблема в том, что когда я пытаюсь «добавить ссылку на службу» из моего приложения asp.net, он жалуется на различные вещи, в зависимости от того, на какой URL службы я на него указываю. Конечный результат - я не могу понять, как добавить ссылку на сервис.

Мой интерфейс определен так:

[ServiceContract]
public interface IWave {
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "/devices")]
    List<Device> getDevices();

    ...
}

Вот как я размещаю свой сервис:

// Port is 1178
var endPoint = new EndpointAddress(string.Format("http://localhost:{0}/wave", port));
var waveServiceSingleton = new WaveSVC();

binding = new WebHttpBinding();

var behavior = new WebHttpBehavior();
behavior.FaultExceptionEnabled = true;

host = new WebServiceHost(waveServiceSingleton, endPoint.Uri);

// Get the service debug behavior and tell it to include details about errors
ServiceDebugBehavior sdb;
sdb = host.Description.Behaviors.Find<ServiceDebugBehavior>();
sdb.IncludeExceptionDetailInFaults = true;

host.AddServiceEndpoint(typeof(IWave), binding, "");

// Add mex endpoint
ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior();
mexBehavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(mexBehavior);
host.AddServiceEndpoint(typeof(IWave), MetadataExchangeBindings.CreateMexHttpBinding(), endPoint.Uri.AbsoluteUri + "/mex");

host.Open();

Когда я просматриваю http://localhost:1180/wave/devices,, я вижу строку json в теле моего браузера. Это ожидается и работает как хотелось бы. Я не могу указать свой мастер «Добавить ссылку на службу» на этот URL, так как он жалуется, что:

The document at the url http://localhost:1178/wave/devices was not recognized as a known     document type.
The error message from each known type may help you fix the problem:
- Report from 'XML Schema' is 'Data at the root level is invalid. Line 1, position 1.'.
- Report from 'DISCO Document' is 'Data at the root level is invalid. Line 1, position  1.'.
- Report from 'WSDL Document' is 'There is an error in XML document (1, 1).'.
  - Data at the root level is invalid. Line 1, position 1.
Metadata contains a reference that cannot be resolved: 'http://localhost:1178/wave/devices'.
The remote server returned an unexpected response: (405) Method Not Allowed.
The remote server returned an error: (405) Method Not Allowed.
If the service is defined in the current solution, try building the solution and adding the service reference again.

У меня есть неприятное подозрение, что мне нужно указать свою «Добавить ссылку на службу» на mex, но это тоже не работает, и действительно, когда я перехожу по адресу mex http://localhost:1178/wave/mex,, я получаю пустая страница.

РЕДАКТИРОВАТЬ 1

Просто чтобы устранить виновника JSON, я изменил свой контракт на вывод Xml вместо Json. Результат был таким же: я не могу добавить ссылку на службу, используя этот URL: http://localhost:1178/zwave/devices/xml (хотя этот URL создает XML).

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate= "/devices/xml")]

Заранее благодарим за предоставленную помощь.

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Возможно, найдено для пустой страницы:

Заменить

host = new WebServiceHost(waveServiceSingleton, endPoint.Uri);

на

host = new ServiceHost(waveServiceSingleton, endPoint.Uri);

это сработало для меня

0 голосов
/ 30 ноября 2010

Традиционно опция «добавить веб-ссылку», которую вы используете в Visual Studio, предназначена только для ссылки на веб-службы XML. Ваш сервис определяется с точки зрения rest / json, а не с точки зрения мыла / xml / wsdl, которого ожидает Visual Studio.

Я подозреваю, что Visual Studio просто не может генерировать прокси для службы json / rest как ваш . Это подтверждается в документации по стартовому комплекту WCF для .NET 3.5 (см. Раздел «Использование служб RESTful с HttpClient», поиск «невозможно создать прокси со строгой типизацией, как вы использовали»). с мылом ").

Я не уверен, что он по-прежнему не поддерживается в VS2010 / .NET 4.0, но я думаю, что вам нужно искать другой вариант, чем "добавить веб-ссылку".

...