2014-10-28 17 views
8

Tôi sẽ đăng câu hỏi này mặc dù tôi thấy rằng có rất ít người khác tương tự với câu hỏi này. Tuy nhiên tôi không thể tìm thấy giải pháp thỏa mãn về lý do tại sao tôi nhận được lỗi này cũng như cách giải quyết nó.Lỗi: không được hỗ trợ trong ứng dụng WCF Test vì nó sử dụng kiểu System.Threading.Tasks

Vì vậy, hôm nay tôi phải lưu trữ một dịch vụ trên máy tính cục bộ của mình cho mục đích thử nghiệm. Dịch vụ này là một giải pháp dịch vụ WCF duy nhất và nó đã hoạt động theo như tôi biết trong một thời gian dài. Tuy nhiên khi tôi đã tải về dự án và cố gắng để lưu trữ các dịch vụ trên máy tính địa phương của tôi, tôi đã nhận lỗi từ tiêu đề:

Thao tác này không được hỗ trợ trong Client WCF thử nghiệm vì nó sử dụng gõ System.Threading

Vì vậy, khi tôi trở về nhà, tôi quyết định thực hiện một dịch vụ bằng cách sử dụng một số phương pháp không đồng bộ và nhận được để dưới cùng của điều này. Tuy nhiên tôi đã thực sự ngạc nhiên khi tôi nhận được lỗi này chính xác tương tự về dự án gần như trống rỗng mà không sử dụng (hoặc ít nhất là nó có vẻ như vậy) System.Threading.Tasks bất cứ nơi nào.

Vì vậy, những gì tôi đã làm:

  • Tạo mới WCF Service sử dụng Visual Studio 2013 mẫu mặc định
  • Left file mặc định IService1.csService1.svc
  • Thay đổi IService1.cs tới:

    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); 
        } 
    } 
    
    • Thay đổi số Service1.svc thành:

      using System; bằng System.Collections.Generic; bằng System.Linq; bằng System.Runtime.Serialization; bằng System.ServiceModel; sử dụng System.ServiceModel.Web; bằng System.Text;

      namespace WcfService { public class Service1: IService1 { public int GetEmpId (int id) { trở lại id; }} }

Và cách đặt mặc định web.config mà trông như thế này:

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

Tôi thậm chí còn không cố gắng sử dụng Task, Threading hoặc một cái gì đó như thế, chỉ cần muốn thấy rằng dịch vụ của tôi đang hoạt động và tôi có thể bắt đầu thêm mọi thứ và xem khi nào chính xác tôi sẽ gặp lỗi nhưng vì sự ngạc nhiên của tôi sau khi thiết lập Service1.svc làm khởi động của tôi và cố gắng chạy dự án tôi gặp lỗi tương tự:

Thao tác này không được hỗ trợ trong WCF Test Client vì nó sử dụng hệ thống kiểu.Luồng

Ok, bây giờ tôi đã hoàn toàn mất. Tôi đã nhận được lỗi này sau một vài lần thử chạy dự án của tôi. Ngay trước khi đăng câu hỏi này, tôi đã thử lại và lần này tôi không gặp lỗi. Trong thực tế, tôi chỉ cần hoàn thành khách hàng của tôi và tôi có thể tiêu thụ phương pháp GetEmpId().

Vì vậy, những gì đang diễn ra ở đây. Đây là ảnh chụp màn hình khi tôi xây dựng dự án của tôi:

Service

tôi không có phương pháp GetEmpIdAsync(). Tôi chưa thử thêm nó. Và làm thế nào nó đến nó sẽ không xây dựng nhiều lần và bây giờ tất cả của một đột ngột tôi có thể sử dụng phương pháp mà tôi thực sự đã thực hiện ngay từ đầu?

Trả lời

9

WCF sẽ tự động hiển thị cả giao diện đồng bộ và giao diện không đồng bộ cho từng phương pháp của bạn. Cả hai phương thức đó đều gọi GetEmpId đồng bộ ở phía máy chủ, sự khác biệt sẽ chờ kết quả được đồng bộ hoặc không đồng bộ ở phía máy khách.

Nếu bạn đã thực hiện lớp học của bạn là

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

bạn vẫn sẽ thấy int GetEmpId(int id) vào công cụ kiểm tra. WCF đủ thông minh để ánh xạ hai phiên bản với cùng một chức năng.

Lỗi "bạn đang thấy chỉ là giới hạn của công cụ kiểm tra đi kèm với studio trực quan, cả hai chức năng gọi cùng một chức năng phía máy chủ để không có lực hấp dẫn để Microsoft thêm hỗ trợ. Không có lỗi thực sự. Nếu bạn thực sự muốn thử nghiệm phiên bản async, bạn sẽ cần phải viết ứng dụng thử nghiệm của riêng bạn gọi hàm đó.

+0

Cảm ơn bạn đã giải thích. Dịch vụ này đã được thực hiện cách đây nhiều năm và thực tế là tôi nhận được lỗi đã gây nhầm lẫn cho tôi nhiều nhất kể từ khi tôi biết dịch vụ này đã được làm việc trong một thời gian dài. Tôi không có kế hoạch sử dụng nó trong chế độ không đồng bộ, trái lại tôi thực sự tự hỏi tại sao MS sẽ thực hiện một quy ước như vậy. Ít nhất đối với tôi, vì tôi đang sử dụng 'WCF' hiếm khi nó có vẻ thực sự kỳ lạ và khó hiểu. Tôi đoán đó là một cái gì đó mà đi kèm với các phiên bản mới hơn của 'Visual Studio' ... Tuy nhiên, cảm ơn một lần nữa. – Leron

+0

Btw, có cách nào để "nói" công cụ này chỉ tìm kiếm các phương thức đồng bộ để tôi không nhận được những tin nhắn đó không? – Leron

+1

Công cụ kiểm tra đó, tôi không nghĩ vậy. Tuy nhiên nếu bạn đang sử dụng [SvcUtil] (http://msdn.microsoft.com/en-us/library/aa347733 (v = vs.110) .aspx) để tạo giao diện, bạn chỉ cần bỏ qua '/ async' hoặc nếu bạn đang sử dụng giao diện "Thêm dịch vụ làm mát", chỉ cần nhấp vào 'Nâng cao', sau đó bỏ chọn hộp cho "[Cho phép tạo các hoạt động không đồng bộ] (http://i.stack.imgur.com/GNsK0.png)" –

Các vấn đề liên quan