2012-03-20 31 views
26

Tôi đã tìm kiếm xung quanh cố gắng giải quyết vấn đề tôi đang gặp phải với WCF. Tôi rất mới đến WCF vì vậy tôi đã không chắc chắn chính xác những gì đang xảy ra.Tại sao AspNetCompatibilityRequirementsMode.Allowed sửa lỗi này?

Tôi đang sử dụng Visual Studio 2010 và đã làm Trang web mới-> Dịch vụ WCF. Tôi đã tạo dịch vụ của mình và trong tệp cấu hình, nếu tôi đặt aspNetCompatibilityEnabled="true", tôi sẽ gặp lỗi này khi truy cập dịch vụ thông qua trình duyệt web của tôi.

The service cannot be activated because it does not support ASP.NET compatibility. 
ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config 
or add the AspNetCompatibilityRequirements attribute to the service type with RequirementsMode 
setting as 'Allowed' or 'Required'. 

Tôi không hiểu ý nghĩa của điều này. Lý do tại sao aspNetCompatibilityEnabled="true" gây ra lỗi này khi [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] sửa lỗi.

Với tôi, có vẻ như họ cũng làm như vậy. Ngoài ra, nếu không có thuộc tính đó thì Silverlight không thể gọi các phương thức WCF của tôi. Tại sao vậy?

Đây là tập tin cấu hình của tôi nếu cần thiết:

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <customErrors mode="Off"/> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="LargeBuffer" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" /> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="Services.Exporter"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="LargeBuffer" 
      contract="Services.IExporter" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment 
     multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

Vì vậy, câu hỏi của tôi là, tại sao không thêm Compatibility thuộc tính khắc phục điều đó? Ngoài ra, tại sao nó cần thiết cho silverlight để có nó?

Trả lời

36

Khi bạn đặt aspNetCompatibilityEnabled thành true trong tệp cấu hình của mình, bạn đang nói rằng các dịch vụ của bạn sẽ tham gia vào đường dẫn ASP.NET; vì vậy các mục như phiên ASP.NET có sẵn. Bạn cần phải trang trí các dịch vụ của mình một cách thích hợp nếu đây là trường hợp, vì Chế độ tương thích ASP.NET được đặt thành false theo mặc định.

Vì vậy, bằng cách trang trí triển khai dịch vụ của bạn với RequirementsMode của Allowed, bạn đang nói một nền tảng trung bình hài lòng về cơ bản dịch vụ của bạn không quan tâm chế độ aspNetCompatibility là (đúng hay sai). Nếu số RequirementsMode của bạn là Required, thì bạn cần phải có cấu hình aspNetCompatibilityEnabled được đặt thành true; điều ngược lại là đúng nếu số RequirementsMode của bạn được đặt thành NotAllowed.

(Nếu bạn đi với mặt đất giữa hạnh phúc của RequirementsMode của phép, bạn có thể kiểm tra trong việc thực hiện dịch vụ của bạn nếu aspNetCompatibilityEnabled được kích hoạt hay không bằng cách kiểm tra tĩnh ServiceHostingEnvironment.AspNetCompatibilityEnabled tài sản.)

Silverlight phải có một sự phụ thuộc vào các ASP.NET pipeline (Tôi không phải là một nhà phát triển Silverlight), đó là lý do tại sao bạn cần phải kích hoạt chế độ tương thích này trong cấu hình của bạn và trên các dịch vụ của bạn để chúng được gọi bởi các ứng dụng Silverlight.

Kiểm tra tài liệu của MSDN về số here này. Điều cần biết là nếu bạn không cần ASP.NET goodies đường ống, sau đó bạn không cần phải trang trí các dịch vụ của bạn hoặc thiết lập các thiết lập aspNetCompatibilityEnabled trong cấu hình của bạn (chúng bị tắt theo mặc định).

+0

Câu hỏi, trang trí phù hợp này sẽ là gì nếu tôi đặt nó thành đúng? – Justin

+0

Tùy thuộc vào việc dịch vụ của bạn có cần các mục có sẵn với đường dẫn ASP.NET hay không. Nếu bạn không thực sự quan tâm, thì bạn sẽ đặt nó thành 'RequirementsMode.Allowed'. Nếu bạn dựa vào các thành phần đó (như Session), thì bạn nên đặt nó thành 'RequirementsMode.Required'. –

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