我是WebServices的新手,有一个简单的问题。
我用Visual Studio 2017编写了一个"Hello World"服务: ServiceAjax.svc.cs:
namespace WebServiceTest
{
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceAjax
{
[OperationContract]
[WebGet]
public string DoWork()
{
return "Hallo World";
}
}
}
ServiceAjax.svc 的描述如下:
<%@ ServiceHost Language="C#" Debug="true" Service="WebServiceTest.ServiceAjax" CodeBehind="ServiceAjax.svc.cs" %>
运行这个工作正常。
现在我读到这是为服务声明接口的方法。 几乎每个示例都这样做...,所以我尝试了:
ServiceAjax.svc.cs:
namespace WebServiceTest
{
[ServiceContract]
public interface IServiceAjax
{
[OperationContract]
[WebGet]
string DoWork();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ServiceAjax: IServiceAjax
{
public string DoWork()
{
return "Hallo World";
}
}
}
运行这个我得到一个错误: 它是德语,所以我的翻译可能不像英文信息那样准确: "从 http://localhost:58513/ServiceAjax.svc 无法加载元数据......" 我比他告诉我: WebServiceTest.ServiceAjax 在 ServiceAjax 实现的合约列表中找不到
所以,它一定是一个转储犯规,因为我无法解释为什么提取接口会破坏服务,我肯定错过了一些简单的东西。
但是我找不到与网络中的"简单WCF Web HTTP 服务"示例的区别。
想法?
更新:我将其添加到现有的ASPX项目中,而不是"干净"的wcf项目....
我自己找到了答案(在获得风滚草徽章后......
WebConfig 中缺少一行
<endpoint address="mex"
binding="mexHttpBinding"
name="mex"
contract="IMetadataExchange" />
我尝试过在 SVC 标记中使用不同的"工厂",但没有奏效。 也许还没有找到合适的... 即
<%@ServiceHost language=c# Debug="true" Service="WebServiceTest.ServiceAjax"
Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory%>
毕竟,手动添加配置并添加到其中确实起到了作用。 我按照中的步骤操作
https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-use-configuration-to-add-an-aspnet-ajax-endpoint
这导致了"无法加载元数据"问题,我可以用顶部(墨西哥端点(上的行修复。 为什么 mircosoft [原文如此] 没有指出这一点,我不知道...... 以及为什么在使用界面时开始需要这,我也不知道。 但是当他需要它时,我偶然发现了更多情况,即 AJAX 脚本管理器,它也需要在服务声明中使用命名空间参数:
[ServiceContract(Namespace = "AJAXService")]
在我添加到 web.config 的内容下方(全部准备好包括掉落 4 个短缺的行
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="myServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="myDataAspNetAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="myServiceTypeBehaviors"
name="WebServiceTest.ServiceAjax">
<endpoint address=""
behaviorConfiguration="myDataAspNetAjaxBehavior"
binding="webHttpBinding"
name="ZESData"
contract="WebServiceTest.IZESData" />
<endpoint address="mex"
binding="mexHttpBinding"
name="mex"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>