我知道如何在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服务引用。
答案 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文件。