如何获取WSDL /描述以便我可以在另一个项目中添加Web Reference?

时间:2011-08-16 13:24:31

标签: c# wcf web-services rest webservicehost

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

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

所以,我运行的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

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

“添加服务参考” - > “添加Web引用” 在URL中我写了我的网址http://mysite.com:8080

然后我得到“服务......没有找到端点”。和添加Web引用框中的错误消息:

  

下载'http://mysite.com:8080/'时出错。请求   HTTP状态404失败:未找到。下载时出错   'http://mysite.com:8080/$metadata'。请求因HTTP失败   状态404:未找到。

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

所以更短的问题是:WSDL / description不存在,所以我无法添加Web服务引用。

3 个答案:

答案 0 :(得分:3)

此处的问题是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

答案 1 :(得分:1)

您需要将ServiceMetadataBehavior添加到主机引用MSDN Reference

// Enable Mex
host.Description.Behaviors.Add(new ServiceMetadataBehavior{ HttpGetEnabled = true });

答案 2 :(得分:0)

我认为你需要为你的web服务创建WSDL或disco文件,因为你在本地运行你的web服务,就像你说的那样执行得很好。在我执行我的webservice的情况下,我得到了我页面顶部的链接“服务描述”。当您点击此处时,您将在浏览器中获取您的WSDL文件。另一种方法是在您的查询字符串末尾添加“?wsdl”,您将获得您的wsdl文件。