WCF Web HTTP-formatering
Med WCF Web HTTP-programmeringsmodellen kan du dynamiskt fastställa det bästa formatet för en tjänståtgärd för att returnera svaret i. Två metoder för att fastställa ett lämpligt format stöds: automatisk och explicit.
Automatisk formatering
När den är aktiverad väljer automatisk formatering det bästa format där svaret ska returneras. Det avgör det bästa formatet genom att kontrollera följande i ordning:
Medietyperna i begärandemeddelandets Accept-huvud.
Innehållstypen för begärandemeddelandet.
Standardformatinställningen i åtgärden.
Standardformatinställningen i WebHttpBehavior.
Om begärandemeddelandet innehåller ett Accept-huvud söker WCF-infrastrukturen (Windows Communication Foundation) efter en typ som stöds. Accept
Om rubriken anger prioriteter för dess medietyper respekteras de. Om inget lämpligt format finns i Accept
rubriken används innehållstypen för begärandemeddelandet. Om ingen lämplig innehållstyp har angetts används standardformatinställningen för åtgärden. Standardformatet anges med parametern ResponseFormat
och WebInvokeAttribute attributenWebGetAttribute. Om inget standardformat har angetts för åtgärden används värdet för DefaultOutgoingResponseFormat egenskapen. Automatisk formatering förlitar sig på egenskapen AutomaticFormatSelectionEnabled . När den här egenskapen är inställd true
på avgör WCF-infrastrukturen det bästa format som ska användas. Automatisk formatering är inaktiverad som standard för bakåtkompatibilitet. Automatisk formatering kan aktiveras programmatiskt eller via konfiguration. I följande exempel visas hur du aktiverar automatiskt formatval i kod.
// 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());
}
Automatisk formatering kan också aktiveras via konfiguration. Du kan ange egenskapen AutomaticFormatSelectionEnabled direkt på WebHttpBehavior eller med hjälp av WebHttpEndpoint. I följande exempel visas hur du aktiverar valet av automatiskt format på 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>
I följande exempel visas hur du aktiverar automatiskt formatval med hjälp av 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>
Explicit formatering
Som namnet antyder avgör utvecklaren i explicit formatering det bästa format som ska användas i åtgärdskoden. Om det bästa formatet är XML eller JSON ställer utvecklaren in Format på antingen Xml eller Json. Om egenskapen inte uttryckligen Format anges används åtgärdens standardformat.
I följande exempel kontrolleras frågesträngsparametern format för ett format som ska användas. Om den har angetts anger den åtgärdens format med hjälp av 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;
}
Om du behöver stöd för andra format än XML eller JSON definierar du åtgärden så att den har en returtyp av Message. I åtgärdskoden bestämmer du vilket format som ska användas och skapar sedan ett Message objekt med någon av följande metoder:
WebOperationContext.CreateAtom10Response
WebOperationContext.CreateJsonResponse
WebOperationContext.CreateStreamResponse
WebOperationContext.CreateTextResponse
WebOperationContext.CreateXmlResponse
Var och en av dessa metoder tar innehåll och skapar ett meddelande med rätt format. Metoden WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements
kan användas för att hämta en lista över format som föredras av klienten i ordning efter fallande inställningar. I följande exempel visas hur du använder WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements
för att fastställa vilket format som ska användas och använder sedan lämplig metod för att skapa svarsmeddelandet.
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);
}
}