无法将服务引用添加到自托管WCF服务

时间:2010-11-30 13:51:09

标签: c# c#-4.0 wcf wcf-client

我已经创建了一个REST web服务,我需要在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,但这也不起作用,实际上,当我浏览到http://localhost:1178/wave/mex的mex地址时,我得到了一个空白页。

编辑1

为了消除JSON是罪魁祸首,我将合同改为输出Xml而不是Json。结果是一样的:我无法使用此URL添加服务引用:http://localhost:1178/zwave/devices/xml(即使该URL生成XML)。

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

提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

传统上,您在Visual Studio中使用的“添加Web引用”选项仅用于引用XML Web服务。您的服务是根据rest / json定义的,而不是视觉工作室期望的soap / xml / wsdl。

我怀疑Visual Studio只是无法为您的生成json / rest服务的代理。这在WCF rest starter kit for .NET 3.5的文档中得到了证实(请参阅“使用HttpClient使用RESTful服务”一节,搜索“不可能像生成SOAP一样生成强类型代理”)。

我不确定它在VS2010 / .NET 4.0中是否仍然不受支持,但我认为你必须寻找另一种选择,而不是“添加网络参考”。

答案 1 :(得分:0)

也许在空白页面找到了:

替换

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

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

这对我有用