作为ASMX和WCF服务

问题描述:

我有一个现有的Web服务(ASMX)需要作为WCF公开。 ASMX必须保持并且最好不改变客户端。根据this我已经配置如下。服务层由CodeSmith生成,虽然我没有写这些服务,但我知道他们很好,因为他们已经在野外使用了很多年。名称已经改变,以保护无辜的..咧嘴笑。作为ASMX和WCF服务

在服务层存在由CodeSmith中产生的XXX.YYY.MyService类,这是双饰

[ServiceContract(Namespace = "http://XXX.YYY")] 

[WebService(Namespace = "http://XXX.YYY", Name = "MyService")] 

我也创建一个空的接口XXX.YYY.IMyService其通过MyService实现。在这一点上,我可以使用ASMX服务而没有任何问题。

现在我添加一个.svc文件,其包含了服务层...

<%@ ServiceHost Language="C#" Debug="true" Service="XXX.YYY.MyService" %> 

...我配置服务层的web.config与...

<system.serviceModel> 


    <behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
    </behaviors> 


    <services> 
    <service behaviorConfiguration="MyServiceBehavior" name="XXX.YYY.MyService"> 
    <endpoint binding="basicHttpBinding" contract="XXX.YYY.IMyService"> 
    <identity> 
     <dns value="localhost" /> 
    </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
    </services> 


</system.serviceModel> 

如果我编译并尝试在Visual Studio 2010中为该服务创建服务引用,则我会看到.ASMX和.SVC版本为MyService。在“添加服务引用”对话框中展开.svc分支会导致引用空白XML文档的错误。

如果我检查事件日志中我得到...

虚拟主机提供商无法处理请求。 发件人信息:System.ServiceModel.ServiceHostingEnvironment + HostingManager/39449526 异常:System.ServiceModel.ServiceActivationException:由于编译期间出现异常,无法激活服务'/System/MyService.svc'。异常消息是:合同名称“XXX.YYY.IMyService”无法通过该服务“为MyService”执行合同的列表中找到.. --->

...但MyService标为实现IMyService ...

public partial class MyService : IMyService 

我也试图改变该服务的合同属性MyService,而不是接口。这有效,但对于客户端代码中断,因为任何尝试创建服务实例都失败,因为它现在是一个接口。

我希望这是有道理的。请随时提出任何额外的问题。我试图尽可能详细。

(没有涉及IIS ..这纯粹是在Visual Studio 2010中)。

谢谢。

我的答案是将[ServiceContract]和[OperationContract]声明移至界面。这已经解决了我的问题。

HTH。

你的代码实现了IMyService,你确定它是XXX.YYY.IMyService。