1

我知道如何在 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

然后我得到“服务......找不到端点”。以及 Add Web Reference 框中的错误消息:

下载“ http://example.com:8080/ ”时出错。请求失败,HTTP 状态为 404:未找到。下载“ http://example.com:8080/$metadata ”时出错。请求失败,HTTP 状态为 404:未找到。

如果我打开 Web 浏览器并直接访问http://example.com:8080/GetArea,该服务将按预期调用/执行。

因此,将问题改写得更短:WSDL/描述不存在,因此我无法添加 Web 服务引用。

4

3 回答 3

4

这里的问题是,WebServiceHost在添加ServiceMetadataBehavior. 在 dotPeek (reflector) 中查看WebServiceHost,方法内部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.

于 2011-09-15T14:24:49.140 回答
1

您需要将 ServiceMetadataBehavior 添加到主机,请参阅MSDN 参考

// Enable Mex
host.Description.Behaviors.Add(new ServiceMetadataBehavior{ HttpGetEnabled = true });
于 2011-08-16T13:34:34.670 回答
0

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

于 2011-12-13T17:08:46.133 回答