Skip to main content
 首页 » 编程设计

c#之我如何获得 WSDL/描述以便我可以在另一个项目中添加 Web 引用

2024年02月03日29dyllove98

我知道如何在 Visual Studio 中添加 WebReference,非常简单。

我也知道如何创建一个普通的 ASP.NET Web 服务项目,但这不是我在这里要做的。

所以,我运行的 WebService 看起来像这样:

try 
{ 
    if (host != null) 
    { 
         host.Close(); 
         host = null; 
    } 
    baseAddress = new Uri("http://example.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 

问题是,当我尝试在 Visual Studio 中向上述服务添加 WebReference 时,出现错误。

“添加服务引用”-->“添加 Web 引用” 在 URL 中我写下我的 URL,http://example.com:8080

然后我收到“服务 ... 未找到端点”。以及“添加 Web 引用”框中的错误消息:

There was an error downloading 'http://example.com:8080/'. The request failed with HTTP status 404: Not Found. There was an error downloading 'http://example.com:8080/$metadata'. The request failed with HTTP status 404: Not Found.

如果我打开网络浏览器并直接转到 http://example.com:8080/GetArea服务按预期调用/执行。

所以为了更简短地改述问题:WSDL/描述不存在,所以我无法添加 Web 服务引用。

请您参考如下方法:

这里的问题是 WebServiceHost 将删除您在添加 ServiceMetadataBehavior 时尝试实现的功能。查看 WebServiceHost 的 dotPeek(反射器),在 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。