gpt4 book ai didi

c# - 无法将服务引用添加到自承载 WCF 服务

转载 作者:太空宇宙 更新时间:2023-11-03 16:49:59 25 4
gpt4 key购买 nike

我已经创建了一个 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 成为罪魁祸首,我将契约(Contract)更改为输出 Xml 而不是 Json。结果是一样的:我无法使用此 URL 添加服务引用:http://localhost:1178/zwave/devices/xml (即使该 URL 生成 XML)。

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

在此先感谢您提供的任何帮助。

最佳答案

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

我怀疑 Visual Studio 无法像您一样为 json/rest 服务生成代理WCF rest starter kit for .NET 3.5 上的文档证实了这一点(请参阅“使用 HttpClient 使用 RESTful 服务”部分,搜索“无法像您习惯使用 SOAP 那样生成强类型代理”)。

我不确定它是否在 VS2010/.NET 4.0 中仍然不受支持,但我认为你必须寻找除“添加 Web 引用”之外的其他选项。

关于c# - 无法将服务引用添加到自承载 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4314452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com