2011-11-10 23 views
19

Tôi có một ứng dụng đang hoạt động bằng cách sử dụng Json.NET (newtonsoft) làm bộ nối tiếp tùy chỉnh. Hiện nay tôi đang thêm dẫn xuất này của WebHttpBehavior trong một WebServiceHostFactory tùy chỉnh. Xem đoạn mã ở cuối this blog để biết cách tôi đính kèm đoạn mã đó.Hành vi tùy chỉnh sẽ không đăng ký trong web.config của tôi

Khi tôi đang lưu trữ dịch vụ này trong IIS, tôi muốn loại bỏ mã lưu trữ tùy chỉnh của mình và chỉ cần thêm hành vi tùy chỉnh vào web.config của tôi. Quy trình được hiển thị trong số này msdn article.

Vì vậy, tôi cố gắng làm điều đó như sau:

<behaviors> 
    <endpointBehaviors> 
    <behavior name="jsonRest"> 
     <webHttp defaultOutgoingResponseFormat="Json" /> 
     <NewtonsoftJsonBehavior/> 
    </behavior> 
    </endpointBehaviors> 
    <serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="NewtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehavior, NewtonsoftJsonExtensions, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 

Đáng buồn thay, tôi không thể làm cho công việc đó. Khi tôi làm điều đó, Visual Studio nói với tôi rằng

Yếu tố 'hành vi' có phần tử con không hợp lệ 'NewtonsoftJsonBehavior'

Trong afforementioned msdn article, nó nói rằng

Để thêm khả năng cấu hình cho phần tử, bạn cần phải viết và đăng ký một phần tử cấu hình. Để biết thêm thông tin về điều này, hãy xem tài liệu System.Configuration.

Sau khi phần tử và loại cấu hình của nó được xác định, phần mở rộng có thể được sử dụng, như trong ví dụ sau.

Tôi có cảm giác rằng những gì tôi thiếu là chính xác điều đó. Bằng cách nào đó đăng ký phần tử và loại cấu hình của nó. Đáng buồn là tôi không thể làm cho người đứng đầu hoặc đuôi của System.Configuration đó là nghĩa vụ phải cho tôi biết làm thế nào để làm điều này. Vì vậy, đó là câu hỏi cơ bản của tôi:

Làm cách nào để viết và đăng ký phần tử cấu hình và nếu đó không phải là vấn đề của tôi thì vấn đề là gì?

Rất cám ơn trước!

Trả lời

37

Phần còn thiếu là lớp BehaviorExtensionElement. Trong OP tôi đã cố gắng để thêm WebHttpBehavior-phái sinh như là một phần tử. BehaviorExtensionElement cho trình phân tích cú pháp cấu hình sử dụng cho một phần tử nào đó.

Đây là việc thực hiện tôi cần:

public class NewtonsoftJsonBehaviorExtension : BehaviorExtensionElement 
{ 
    public override Type BehaviorType 
    { 
     get { return typeof(NewtonsoftJsonBehavior); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new NewtonsoftJsonBehavior(); 
    } 
} 

này không đủ để thoát khỏi WebServiceHostFactory tùy chỉnh của tôi, tất nhiên.Vì tôi cũng phải thêm một ContentTypeMapper tùy chỉnh:

public class NewtonsoftJsonContentTypeMapper : WebContentTypeMapper 
{ 
    public override WebContentFormat GetMessageFormatForContentType(string contentType) 
    { 
     return WebContentFormat.Raw; 
    } 
} 

Sau đó tôi có thể sử dụng chúng trong Web.config của mình. Dưới đây là các phần liên quan của cấu hình làm việc. Thứ nhất thiết lập phần mở rộng và cấu hình một hành vi với nó:

<extensions> 
    <behaviorExtensions> 
    <add name="newtonsoftJsonBehavior" type="Newtonsoft.Json.Extensions.NewtonsoftJsonBehaviorExtension, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="jsonRestEndpointBehavior"> 
     <webHttp/> 
     <newtonsoftJsonBehavior/> 
    </behavior> 
    </endpointBehaviors> 
<behaviors> 

Sau đó cấu hình một webHttpBinding với contentTypeMapper tùy chỉnh của tôi:

<bindings> 
    <webHttpBinding> 
    <binding name="newtonsoftJsonBinding" contentTypeMapper="Newtonsoft.Json.Extensions.NewtonsoftJsonContentTypeMapper, NewtonsoftJsonExtensions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </webHttpBinding> 
</bindings> 

Cuối cùng thiết lập một thiết bị đầu cuối sử dụng ở trên:

<services> 
    <service name="My.Namespaced.MyService" behaviorConfiguration="jsonRestServiceBehavior"> 
    <endpoint address=""    behaviorConfiguration="jsonRestEndpointBehavior" 
       binding="webHttpBinding" bindingConfiguration="newtonsoftJsonBinding" 
       contract="My.Namespaced.IMyService" /> 
    </service> 
</services> 

Hy vọng công cụ này sẽ giúp ai đó ra khỏi đó. :)

2

Nếu bạn mở app.config này với svcconfigeditor, nó sẽ bắt đầu yêu cầu chọn assembly được kết hợp với NewtonsoftJsonBehavior. Nếu bạn chọn điều đó và lưu lại app.config, điều đó có giải quyết được sự cố của bạn không?

BTW, chúng tôi cũng sử dụng phần mở rộng ràng buộc tùy chỉnh trong cấu hình dịch vụ của chúng tôi. Các xml trong cấu hình luôn luôn nhấn mạnh phần mở rộng với một làn sóng màu xanh chỉ ra rằng các yếu tố không biết đến giản đồ như bạn mô tả nó. Tuy nhiên, khi chúng tôi bắt đầu dịch vụ, cả dịch vụ và chức năng hành vi như mong đợi.

+0

Tôi sẽ thử svcconfigeditor điều đầu tiên vào ngày mai và báo cáo lại. Về phần khác, khi tôi thử chạy ứng dụng của mình, gọi dịch vụ hiển thị web.config của tôi trong trình duyệt và làm nổi bật thẻ tùy chỉnh là lý do khiến dịch vụ không thể chạy. Không thể nhớ chính xác thư, nhưng cũng có thể đăng bài vào ngày mai, nếu điều đó có ích. – Mithon

+0

Thêm một câu trả lời của riêng tôi, nhưng upvoted của bạn kể từ khi chỉ cho tôi để SvcConfigEditor đã giúp tôi theo dõi những gì tôi cần phải làm. – Mithon

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