我在C#中创建了一个Web服务(REST)。现在我希望当有人使用它时,它应该按照Header返回JSON或XML。我找到了一个非常好的tutorial here。我跟着它,但我不知道它在哪里说set both the HTTP Accept and Content-Type headers to "application/xml"
,我这样称呼http://localhost:38477/social/name
。如果我的问题不是很清楚,我可以回答任何问题
谢谢
这是我的代码
[WebInvoke(UriTemplate = "{Name}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
public MyclassData Get(string Name)
{
// Code to implement
return value;
}
答案 0 :(得分:5)
您使用什么框架(看起来像旧的WCf Web Api)来构建您的RESTful服务?我强烈建议使用Microsofts新的MVC4 Web API。它真正开始成熟并大大简化了构建RESTful服务。它将在未来支持WCF Web API即将停止使用。
您只需将ModelClass作为返回类型返回,它将根据请求接受标头自动将其序列化为XML或JSON。您可以避免编写重复的代码,并且您的服务将支持广泛的客户。
public class TwitterController : ApiController
{
DataScrapperApi api = new DataScrapperApi();
TwitterAndKloutData data = api.GetTwitterAndKloutData(screenName);
return data;
}
public class TwitterAndKloutData
{
// implement properties here
}
<强>链接强>
您可以通过下载MVC4 2012 RC获得MVC4 Web Api,也可以下载整个Visual Studio 2012 RC。
MVC 4:http://www.asp.net/mvc/mvc4
VS 2012:http://www.microsoft.com/visualstudio/11/en-us/downloads
对于原始的wcf web api,请试一试。检查接受标头并根据其值生成响应。
var context = WebOperationContext.Current
string accept = context.IncomingRequest.Accept;
System.ServiceModel.Chanells.Message message = null;
if (accept == "application/json")
message = context.CreateJsonResponse<TwitterAndCloutData>(data);
else if (accept == "text/xml")
message = context.CreateXmlResponse<TwitterAndCloutData>(data);
return message;
您可以在启动请求的任何客户端上设置接受标头。这取决于您用于发送请求的客户端类型,但任何http客户端都可以添加标头。
WebClient client = new WebClient();
client.Headers.Add("accept", "text/xml");
client.DownloadString("domain.com/service");
要访问响应标头,您可以使用
WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
其他资源:http://dotnet.dzone.com/articles/wcf-rest-xml-json-or-both
答案 1 :(得分:4)
您在RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml
属性中指定了WebInvoke
,它将请求和响应的格式限制为Xml。 删除RequestFormat和ResponseFormat 属性,让框架根据Http标头对其进行处理。 内容类型标头指定请求正文类型,接受标头指定响应正文类型。
修改强>
这是您使用fiddler发送请求的方式。
您可以使用REST starter kit附带的 Microsoft.Http 和 Microsoft.Http.Extensions dll来编写客户端代码。以下是一个示例。
var client = new HttpClient("http://localhost:38477/social");
client.DefaultHeaders.Accept.AddString("application/xml");
client.DefaultHeaders.ContentType = "application/xml";
HttpResponseMessage responseMessage = client.Get("twitter_name");
var deserializedContent = responseMessage.Content.ReadAsDataContract<YourTypeHere>();
答案 2 :(得分:-1)
你能为你的方法创建两个重载:
[WebInvoke(UriTemplate = "dostuff", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public StuffResponse DoStuff(RequestStuff requestStuff)
[WebInvoke(UriTemplate = "dostuff", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
public StuffResponse DoStuff(RequestStuff requestStuff)