Если ваша цель состоит в том, чтобы иметь 1 метод для обслуживания как XML, так и JSON, я мог бы добиться этого, как показано ниже:
<service name ="XMLService.MultipleEndpointService">
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="XMLService.IMultipleEndpointService" />
<endpoint name="pox" address="pox" binding="webHttpBinding" behaviorConfiguration="web" contract="XMLService.IMultipleEndpointService" />
<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
Теперь в вашем классе, который реализует интерфейс, я сделал следующее:
public Tram[] GetOverview(string id)
{
IList<ContentType> acceptHeaderElements = WebOperationContext.Current.IncomingRequest.GetAcceptHeaderElements();
for (int x = 0; x < acceptHeaderElements.Count; x++)
{
string normalizedMediaType = acceptHeaderElements[x].MediaType.ToLowerInvariant();
switch (normalizedMediaType)
{
case "application/xml":
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Xml;
break;
case "application/json":
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
break;
}
}
return new[] { new Tram() { TramName = "Tram 1" }, new Tram() { TramName = "Tram 2" } };
}
Теперь, когда я выполняю указанную выше службу, используя Fiddler:
GET http://localhost/XMLService/multipleendpointservice.svc/pox/GetOverview HTTP/1.1
User-Agent: Fiddler
Host: localhost
Accept: application/json
Мой ответ
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 79
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 30 Nov 2011 11:39:16 GMT
[{"<TramName>k__BackingField":"Tram 1"},{"<TramName>k__BackingField":"Tram 2"}]
Аналогично, когда я выполняю:
GET http://localhost/XMLService/multipleendpointservice.svc/pox/GetOverview HTTP/1.1
User-Agent: Fiddler
Host: localhost
Accept: application/xml
Мой ответ:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 334
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 30 Nov 2011 11:39:09 GMT
<ArrayOfTram xmlns="http://schemas.datacontract.org/2004/07/XMLService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Tram><_x003C_TramName_x003E_k__BackingField>Tram 1</_x003C_TramName_x003E_k__BackingField></Tram><Tram><_x003C_TramName_x003E_k__BackingField>Tram 2</_x003C_TramName_x003E_k__BackingField></Tram></ArrayOfTram>
ПРИМЕЧАНИЕ. Заголовок Accept может отличаться от application / xml или application / json. в таких случаях вам нужно справиться с этим.
Другой альтернативой является использование WebServiceHostFactory и использование элемента webHttpEndpoint , который имеет атрибут automaticFormatSelection для выполнения вышеуказанного действия