2011-03-17 176 views
0

我有一個現有的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中)。

謝謝。

回答

0

我的答案是將[ServiceContract]和[OperationContract]聲明移至界面。這已經解決了我的問題。

HTH。

0

你的代碼實現了IMyService,你確定它是XXX.YYY.IMyService。