2011-07-21 33 views
5

Tôi đã có một tập hợp các dịch vụ được lưu trữ với WCF Web Api và tôi liên lạc với chúng bằng JSON từ javascript. Trong hầu hết các trường hợp, tôi không sao thay đổi bit chấp nhận của tiêu đề để yêu cầu phản hồi JSON nhưng có một số trường hợp phát sinh mà tôi không thể thực hiện việc này. Điều này là do khung javascript mà tôi đang sử dụng (Ext JS). Đối với một số điều nó chỉ cho phép tôi chỉ định một URL và không phải là mặc định proxy như tiêu đề.Đặt kiểu phản hồi mặc định trong WCF Web Api

Tuy nhiên, đây không phải là câu hỏi về Ext JS. Web Api dường như mặc định để trả về XML và tôi muốn biết liệu có thể thay đổi mặc định này để nó có thể trả về JSON hay không. Cảm ơn trước!

+0

Giá trị tiêu đề chấp nhận mặc định được đặt thành thời điểm bạn không thể thay đổi? – hskan

Trả lời

1

Theo mã, API web WCF sẽ luôn đặt mặc định cho XmlFormatter nếu nó nằm trong tập hợp các trình định dạng có thể sử dụng. Nếu nó không phải là JsonFormatter được sử dụng thay vào đó nếu điều này là hiện tại. Ngoài ra còn có một tài sản DefaultFormatter nhưng đó là nội bộ, do đó bạn không thể thiết lập đó. Có thể yêu cầu thêm tính năng hữu ích?

2

Bạn có thể sử dụng kênh ủy quyền như được mô tả ở đây http://blog.alexonasp.net/post/2011/07/26/Look-Ma-I-can-handle-JSONP-(aka-Cross-Domain-JSON)-with-WCF-Web-API-and-jQuery!.aspx để ánh xạ URI như http://myserver/myresource/1/json tới http://myserver/myresource/1 và đặt chấp nhận tiêu đề thành ứng dụng/json.

Kênh ủy quyền là một phần của mẫu ContactManager_Advanced khi bạn tải xuống WCF Web API từ http://wcf.codeplex.com.

Tệp này nằm trong tệp UriFormatExtensionMessageChannel.cs.

Nhìn vào global.asax.cs của mẫu về cách làm cho nó chạy.

+0

Ví dụ ngắn gọn hơn về kênh ủy quyền và giải pháp của câu hỏi được hỏi ở trên được cung cấp bởi chính Glenn Block: [http://codepaste.net/wehh49](http://codepaste.net/wehh49) –

4

Một chút thử nghiệm dường như chỉ ra rằng đơn đặt hàng của các định dạng trình định cấu hình được định cấu hình (khá trực quan).

Theo mặc định, khi bạn tạo một thể hiện của HttpConfiguration, bộ sưu tập Formatters của nó có chứa các trình định dạng:

  1. XmlMediaTypeFormatter
  2. JsonValueMediaTypeFormatter
  3. JsonMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

Lý do w hy XML là định dạng mặc định là bởi vì đó là định dạng đầu tiên. Để làm cho JSON giá trị mặc định, bạn có thể sắp xếp lại các bộ sưu tập để trông như thế này:

  1. JsonValueMediaTypeFormatter
  2. JsonMediaTypeFormatter
  3. XmlMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

Với một thể hiện config của HttpConfiguration, đây là một cách để sắp xếp lại bộ sưu tập:

var jsonIndex = Math.Max(
    config.Formatters.IndexOf(config.Formatters.JsonFormatter), 
    config.Formatters.IndexOf(config.Formatters.JsonValueFormatter)); 
var xmlIndex = config.Formatters.IndexOf(
    config.Formatters.XmlFormatter); 

config.Formatters.Insert(jsonIndex + 1, config.Formatters.XmlFormatter); 
config.Formatters.RemoveAt(xmlIndex); 

Điều này có được hỗ trợ hay không mà tôi không biết, nhưng có vẻ như nó hoạt động trên WebApi 0.6.0.

3

Tôi thực sự đã tìm thấy một cách đơn giản để giải quyết vấn đề này. Trước tiên, hãy đảm bảo rằng trình định dạng JSON mặc định là đầu tiên. Và sau đó đặt loại của nó thành văn bản/html. Điều này sẽ đảm bảo rằng trình duyệt nhận được JSON ngay cả khi nó không đặt tiêu đề. Khía cạnh tốt đẹp bên dưới là bạn không bao giờ phải nhớ đặt tiêu đề chấp nhận trong mã máy khách. Nó chỉ hoạt động và luôn luôn mặc định là JSON.

var jsonformatter = config.Formatters.Where(t => t.GetType() == typeof(JsonMediaTypeFormatter)).FirstOrDefault()); 
config.Formatters.Remove(jsonformatter); 
config.Formatters.Insert(0, jsonformatter); 
config.Formatters[0].SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
Các vấn đề liên quan