Pemformatan HTTP Web WCF
Model pemrograman HTTP Web WCF memungkinkan Anda menentukan format terbaik secara dinamis untuk operasi layanan guna mengembalikan responsnya. Dua metode didukung untuk menentukan format yang sesuai: otomatis dan eksplisit.
Pemformatan otomatis
Saat diaktifkan, pemformatan otomatis memilih format terbaik untuk mengembalikan respons. Ini menentukan format terbaik dengan memeriksa hal berikut, secara berurutan:
Jenis media di header Terima pada pesan permintaan.
Jenis konten pesan permintaan.
Pengaturan format default dalam operasi.
Pengaturan format default di WebHttpBehavior.
Jika pesan permintaan berisi header Terima, infrastruktur Windows Communication Foundation (WCF) akan mencari jenis yang didukungnya. Jika header Accept
menentukan prioritas untuk jenis medianya, header tersebut akan diterima. Jika tidak ada format yang sesuai yang ditemukan di header Accept
, jenis konten pesan permintaan akan digunakan. Jika tidak ada jenis konten yang sesuai yang ditentukan, pengaturan format default untuk operasi akan digunakan. Format default diatur dengan parameter ResponseFormat
atribut WebGetAttribute dan WebInvokeAttribute. Jika tidak ada format default yang ditentukan pada operasi, nilai properti DefaultOutgoingResponseFormat akan digunakan. Pemformatan otomatis bergantung pada properti AutomaticFormatSelectionEnabled. Ketika properti ini diatur ke true
, infrastruktur WCF menentukan format terbaik untuk digunakan. Pemilihan format otomatis dinonaktifkan secara default untuk kompatibilitas mundur. Pemilihan format otomatis dapat diaktifkan secara terprogram atau melalui konfigurasi. Contoh berikut menunjukkan cara mengaktifkan pemilihan format otomatis dalam kode.
// This code assumes the service name is MyService and the service contract is IMyContract
Uri baseAddress = new Uri("http://localhost:8000");
WebServiceHost host = new WebServiceHost(typeof(MyService), baseAddress)
try
{
ServiceEndpoint sep = host.AddServiceEndpoint(typeof(IMyContract), new WebHttpBinding(), "");
// Check it see if the WebHttpBehavior already exists
WebHttpBehavior whb = sep.Behaviors.Find<WebHttpBehavior>();
if (whb != null)
{
whb.AutomaticFormatSelectionEnabled = true;
}
else
{
WebHttpBehavior webBehavior = new WebHttpBehavior();
webBehavior.AutomaticFormatSelectionEnabled = true;
sep.Behaviors.Add(webBehavior);
}
// Open host to start listening for messages
host.Open();
// ...
}
catch(CommunicationException ex)
{
Console.WriteLine("An exception occurred: " + ex.Message());
}
Pemformatan otomatis juga dapat diaktifkan melalui konfigurasi. Anda dapat mengatur properti AutomaticFormatSelectionEnabled langsung di WebHttpBehavior atau menggunakan WebHttpEndpoint. Contoh berikut menunjukkan cara mengaktifkan pilihan format otomatis pada WebHttpBehavior.
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp automaticFormatSelectionEnabled="true" />
</behavior>
</endpointBehaviors>
</behaviors>
<standardEndpoints>
<webHttpEndpoint>
<!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. -->
<standardEndpoint name="" helpEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
Contoh berikut menunjukkan cara mengaktifkan pemilihan format otomatis menggunakan WebHttpEndpoint.
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. -->
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
Pemformatan eksplisit
Seperti namanya, dalam pemformatan eksplisit pengembang menentukan format terbaik untuk digunakan dalam kode operasi. Jika format terbaik adalah XML atau JSON, pengembang menetapkan Format ke Xml atau Json. Jika properti Format tidak diatur secara eksplisit, format default operasi akan digunakan.
Contoh berikut memeriksa parameter string kueri format untuk format yang akan digunakan. Jika telah ditentukan, ia mengatur format operasi menggunakan Format.
public class Service : IService
{
[WebGet]
public string EchoWithGet(string s)
{
// if a format query string parameter has been specified, set the response format to that. If no such
// query string parameter exists the Accept header will be used
string formatQueryStringValue = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["format"];
if (!string.IsNullOrEmpty(formatQueryStringValue))
{
if (formatQueryStringValue.Equals("xml", System.StringComparison.OrdinalIgnoreCase))
{
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Xml;
}
else if (formatQueryStringValue.Equals("json", System.StringComparison.OrdinalIgnoreCase))
{
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
}
else
{
throw new WebFaultException<string>($"Unsupported format '{formatQueryStringValue}'", HttpStatusCode.BadRequest);
}
}
return "You said " + s;
}
Jika Anda perlu mendukung format selain XML atau JSON, tentukan operasi Anda untuk memiliki jenis pengembalian Message. Dalam kode operasi, tentukan format yang sesuai untuk digunakan lalu buat objek Message menggunakan salah satu metode berikut:
WebOperationContext.CreateAtom10Response
WebOperationContext.CreateJsonResponse
WebOperationContext.CreateStreamResponse
WebOperationContext.CreateTextResponse
WebOperationContext.CreateXmlResponse
Masing-masing metode ini mengambil konten dan membuat pesan dengan format yang sesuai. Metode WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements
ini dapat digunakan untuk mendapatkan daftar format yang disukai oleh klien untuk mengurangi preferensi. Contoh berikut menunjukkan cara menggunakan WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements
untuk menentukan format yang akan digunakan lalu menggunakan metode respons membuat yang sesuai untuk membuat pesan respons.
public class Service : IService
{
public Message EchoListWithGet(string list)
{
List<string> returnList = new List<string>(list.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
IList<ContentType> acceptHeaderElements = WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements();
for (int x = 0; x < acceptHeaderElements.Count; x++)
{
string normalizedMediaType = acceptHeaderElements[x].MediaType.ToLowerInvariant();
switch (normalizedMediaType)
{
case "image/jpeg": return CreateJpegResponse(returnList);
case "application/xhtml+xml": return CreateXhtmlResponse(returnList);
case "application/atom+xml": return CreateAtom10Response(returnList);
case "application/xml": return CreateXmlResponse(returnList);
case "application/json": return CreateJsonResponse(returnList);
}
}
// Default response format is XML
return CreateXmlResponse(returnList);
}
}