“提取接口”后,WCF Web服务失败

时间:2018-06-26 09:56:42

标签: web-services wcf interface

我是WebService的新手,并且有一个简单的问题。

我用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加载元数据...” 我在下面一点点告诉他: 在ServiceAjax实施的合同列表中找不到WebServiceTest.ServiceAjax wos

因此,它一定是一个转储对象,因为我无法解释为什么提取接口会破坏服务,我肯定错过了一些简单的事情。

但是我找不到与网上的“简单WCF Web HTTP服务”示例有所不同。

想法?

更新:我将其添加到现有的ASPX项目中,而不是“干净的” wcf项目中……。

1 个答案:

答案 0 :(得分:0)

我自己找到了答案(在获得了风滚草徽章后...)

WebConfig中缺少一行

      <endpoint address="mex" 
                binding="mexHttpBinding" 
                name="mex" 
                contract="IMetadataExchange" /> 

我在SVC-Markup中尝试了不同的“工厂”,但是没有用。 也许没有找到合适的... 即

<%@ServiceHost language=c# Debug="true" Service="WebServiceTest.ServiceAjax"  
Factory=System.ServiceModel.Activation.WebScriptServiceHostFactory%> 

手动添加配置并添加到配置中确实可以解决问题。 我按照

中的步骤进行操作

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-use-configuration-to-add-an-aspnet-ajax-endpoint

这导致“无法加载元数据”问题,我可以使用顶部(mex端点)上的行修复此问题。 为什么mircosoft [sic]没有指出这一点,我不知道... 以及为什么在使用界面时开始需要蜂鸣声,我都不知道。 但是我偶然发现更多的场合,当他需要时,即AJAX脚本管理器,它也需要Servicedeclaration中的命名空间参数:

[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>