2014-10-28 61 views
8

即使我看到有其他類似的東西,但我會發布這個問題。然而,我無法找到令人滿意的解決方案,爲什麼我得到這個錯誤,也沒有如何解決它。錯誤:在WCF測試客戶端不支持,因爲它使用類型System.Threading.Tasks

因此,今天我不得不在我的本地計算機上託管一項服務用於測試目的。該服務是一個單一的WCF服務解決方案,據我所知長久以來它一直在工作。然而,當我下載了該項目,並嘗試舉辦我的本地機器上的服務,我從標題錯誤:

該操作未在WCF測試客戶端支持,因爲它使用類型的System.Threading

所以當我回到家時,我決定使用一些異步方法進行一項服務,並深入到底層。然而,當我在任何地方都沒有使用(或者至少看起來是這樣)System.Threading.Tasks這個幾乎空的項目上得到這個完全相同的錯誤時,我真的很驚訝。

所以我做了什麼:

  • 創建新WCF Service使用Visual Studio 2013的默認模板
  • 左默認IService1.cs文件和Service1.svc
  • 改變了IService1.cs到:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Runtime.Serialization; 
    using System.ServiceModel; 
    using System.ServiceModel.Web; 
    using System.Text; 
    
    namespace WcfService 
    { 
        [ServiceContract] 
        public interface IService1 
        { 
         [OperationContract] 
         int GetEmpId(int id); 
        } 
    } 
    
    • Service1.svc更改爲:

      using System; using System.Collections.Generic;使用System.Linq的 ; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text;

      命名空間WcfService { 公共類服務:IService1 { 公衆詮釋GetEmpId(INT ID){ 回報 ID; }} }

後又離開它看起來像這樣的默認web.config

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 

我還沒有嘗試過使用TaskThreading或類似的東西,只是希望看到我的服務已啓動並正在運行,因此我可以開始添加內容並查看我何時會得到該錯誤,但在將Service1.svc設置爲我的啓動後,我感到驚訝類和嘗試運行我得到了同樣的錯誤項目:

此操作在WCF測試客戶端不支持,因爲它使用的類型系統。線程

好吧,現在我完全失去了。經過幾次嘗試運行我的項目後,我收到了這個錯誤。就在發佈這個問題之前,我再次嘗試,這次我沒有得到錯誤。事實上,我剛剛完成了我的客戶端,我可以使用GetEmpId()方法。

那麼這裏發生了什麼。這是截圖,當我建我的項目:

Service

我沒辦法GetEmpIdAsync()。我還沒有嘗試添加它。它是怎麼來的呢不會多次構建,現在突然間我可以使用從一開始我實際實現的方法?

回答

9

WCF將自動爲您的每個方法公開同步和異步接口。這兩種方法在服務器端同步調用GetEmpId,不同之處在於將等待客戶端上的結果同步或異步。

如果你做你的類是

public class Service1 : IService1 
{ 
    public Task<int> GetEmpIdAsync(int id) 
    { 
     return Task.FromResult<int>(id); 
    } 
} 

你仍然看到int GetEmpId(int id)的測試工具。 WCF足夠聰明,可以將兩個版本映射到相同的功能。

你所看到的「錯誤」只是visual studio自帶的測試工具的一個限制,兩個函數都調用相同的服務器端函數,所以沒有強制力讓微軟添加支持。沒有實際的錯誤。如果你真的想測試異步版本,你需要編寫你自己的調用該函數的測試客戶端。

+0

感謝您的解釋。這項服務是在多年前製作的,而我得到錯誤的事實讓我感到困惑,因爲我知道這項服務已經工作了很長時間。我不打算在異步模式下使用它,相反,我真的很想知道爲什麼MS會做出這樣的約定。至少對我來說,因爲我使用'WCF',很少看起來很奇怪和令人困惑。我想這是'Visual Studio'的新版本所帶來的......但是,再次感謝。 – Leron 2014-10-28 19:06:01

+0

順便說一句,有沒有什麼方法可以「告訴」工具只查看同步方法,所以我不會收到這些消息? – Leron 2014-10-28 19:07:55

+1

那個測試工具,我不這麼認爲。但是,如果您使用[SvcUtil](http://msdn.microsoft.com/en-us/library/aa347733(v = vs.110).aspx)來生成您的界面,您只需要關閉'/ async'或者如果您正在使用「添加服務引用」GUI,只需點擊「高級」,然後取消勾選「允許生成異步操作」(http://i.stack.imgur.com/GNsK0.png)「 – 2014-10-28 19:12:04

相關問題