我有一个描述WCF服务中使用的方法的ServiceContract。该方法有一个定义UriTemplate和ResponseFormat的WebGet属性。
我想重用单个方法,并拥有具有不同UriTemplates和不同ResponseFormats的多个WebGet属性。基本上,我希望避免使用多个方法来区分返回类型是XML还是JSON。不过,在我到目前为止看到的所有示例中,都需要为每个WebGet属性创建不同的方法。这是一个示例OperationContract
[ServiceContract]
public interface ICatalogService
{
[OperationContract]
[WebGet(UriTemplate = "product/{id}/details?format=xml", ResponseFormat = WebMessageFormat.Xml)]
Product GetProduct(string id);
[OperationContract]
[WebGet(UriTemplate = "product/{id}/details?format=json", ResponseFormat = WebMessageFormat.Json)]
Product GetJsonProduct(string id);
}
使用上面的例子,我想对xml和json返回类型使用GetProduct方法,如下所示:
[ServiceContract]
public interface ICatalogService
{
[OperationContract]
[WebGet(UriTemplate = "product/{id}/details?format=xml", ResponseFormat = WebMessageFormat.Xml)]
[WebGet(UriTemplate = "product/{id}/details?format=json", ResponseFormat = WebMessageFormat.Json)]
Product GetProduct(string id);
}
有没有办法做到这一点,这样我就不用编写不同的方法来返回不同的ResponseFormats了?
谢谢!
发布于 2010-11-04 07:56:18
你可以做到的
[ServiceContract]
public interface ICatalogService
{
[OperationContract]
[WebGet(UriTemplate = "product/{id}/details?format={format}")]
Stream GetProduct(string id, string format);
}
然后在代码中根据参数上指定的值处理序列化。
对于XML,编写一个处理序列化的助手方法。
public static Stream GetServiceStream(string format, string callback, DataTable dt, SyndicationFeed sf)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
if (format == "xml")
{
XmlSerializer xmls = new XmlSerializer(typeof(DataTable));
xmls.Serialize(writer, dt);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
}
else if (format == "json")
{
var toJSON = new JavaScriptSerializer();
toJSON.RegisterConverters(new JavaScriptConverter[] { new JavaScriptDataTableConverter() });
writer.Write(toJSON.Serialize(dt));
WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
}
else if (format == "jsonp")
{
var toJSON = new JavaScriptSerializer();
toJSON.RegisterConverters(new JavaScriptConverter[] { new JavaScriptDataTableConverter() });
writer.Write(callback + "( " + toJSON.Serialize(dt) + " );");
WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
}
else if (format == "rss")
{
XmlWriter xmlw = new XmlTextWriter(writer);
sf.SaveAsRss20(xmlw);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
}
else if (format == "atom")
{
XmlWriter xmlw = new XmlTextWriter(writer);
sf.SaveAsAtom10(xmlw);
WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
}
else
{
writer.Write("Invalid formatting specified.");
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
}
writer.Flush();
stream.Position = 0;
return stream;
}
}
发布于 2011-03-07 23:29:22
如果我没记错的话,下面的方法对我有效:
json服务合同:
[ServiceContract]
public interface IServiceJson {
[OperationContract()]
[WebGet(UriTemplate = "Operation/?param={param}",
ResponseFormat = WebMessageFormat.Json)]
ReturnType Operation(string param);
}
xml服务的联系人:
[ServiceContract]
public interface IServiceXml {
[OperationContract(Name = "OperationX")]
[WebGet(UriTemplate = "Operation/?param={param}",
ResponseFormat = WebMessageFormat.Xml)]
ReturnType Operation(string param);
}
两者的实现:
public class ServiceImplementation : IServiceJson, IServiceXml {
ReturnType Operation(string param) {
// Implementation
}
}
和web.config配置(注意json和xml响应的端点):
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="serviceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="serviceBehaviour" name="ServiceImplementation">
<endpoint address="json/" behaviorConfiguration="webHttp" binding="webHttpBinding"
bindingConfiguration="webHttpBindingSettings" contract="IServiceJson">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="xml/" behaviorConfiguration="webHttp" binding="webHttpBinding"
bindingConfiguration="webHttpBindingSettings" contract="IServiceXml">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingSettings">
<readerQuotas maxStringContentLength="5000000"/>
</binding>
</webHttpBinding>
</bindings>
</system.serviceModel>
现在,您可以像这样调用您的服务: json response:http://yourServer/json/Operation/?param=value xml response:http://yourServer/xml/Operation/?param=value
(很抱歉,如果上面的代码中有任何错误,我没有运行它来进行验证)。
https://stackoverflow.com/questions/1746857
复制相似问题