除默认XML外,如何启用更多输出格式?

时间:2012-07-04 06:39:35

标签: c# asp.net wsdl

调试Web服务时,我可以使用提供的默认WSDL接口测试函数,该接口允许我输入参数的某些值。这非常方便,但只输出XML。是否有可能在此阶段启用更多选项? (JSON,CSV)

或者如果那是不可能的,我想在API调用filetype=[json,csv]中添加一个额外的参数,但是如何以该格式写回来?我把它作为字符串传递吗?

2 个答案:

答案 0 :(得分:2)

我假设您正在使用WCF。您可以通过几种简单的方法在XML或JSON结果之间进行选择。一个是拥有不同的端点,另一个是拥有不同的方法。第二个选项可以满足您在API调用中包含参数的请求,但我将简要介绍两者。考虑以下端点:

    <endpoint address="/rest/" behaviorConfiguration="web" binding="webHttpBinding" contract="WebApplication1.Interface.ITestRest" />
    <endpoint address="/json/" behaviorConfiguration="web" binding="webHttpBinding" contract="WebApplication1.Interface.ITestJson" />
    <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" contract="WebApplication1.Interface.ITestBoth" />

前两个与选项1相关,用于区分端点(/ rest /或/ json /将在方法之前的url中,并且两个接口都可以定义相同的签名,因此它只能实现一次)。最后一个涉及选项2在接口上有两个方法。以下是上述接口的一组示例:

[ServiceContract]
public interface ITestJson
{
  [OperationContract, WebInvoke(Method = "GET", UriTemplate = "/Echo/{Text}",
    RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
  string Echo(string Text);
}

[ServiceContract]
public interface ITestRest
{
  [OperationContract, WebInvoke(Method = "GET", UriTemplate = "/Echo/{Text}",
    RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
  string Echo(string Text);
}

[ServiceContract]
public interface ITestBoth
{
  [OperationContract, WebInvoke(Method = "GET", UriTemplate = "/Echo?Text={Text}&Format=json",
    RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
  string EchoJ(string Text);
  [OperationContract, WebInvoke(Method = "GET", UriTemplate = "/Echo?Text={Text}&Format=xml",
    RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
  string EchoR(string Text);
}

然后是一个实现这个的类:

public class Signature : ITestJson, ITestRest, ITestBoth
{
  public string Echo(string Text)
  {
    return Text;
  }

  public string EchoR(string Text)
  {
    return Text;
  }

  public string EchoJ(string Text)
  {
    return Text;
  }

现在您可以通过以下方式使用它:

Service1.svc/json/echo/xxx
Service1.svc/rest/echo/xxx

Service1.svc/echo?Text=xxx&Format=json
Service1.svc/echo?Text=xxx&Format=rest

正如我在开始时所说,这些是选择XML或Json的几种简单方式。您的请求也要求提供CSV。目前没有简单的方法来返回CSV。我确实在CodePlex上找到了可以返回TXT的this项目,但我没有检查过它。

答案 1 :(得分:1)

我建议使用ASP.NET MVC 3并创建一个返回JsonResult的操作。此Action可以执行您的WebMethod并将结果序列化为JSON。 (这仅适用于JSON)。

为了获得更大的灵活性,您可以使用ASP.NET(Web窗体)通用处理程序,它可以让您对响应类型和内容进行大量控制。

您还可以考虑ASP.NET MVC 4中的Web API功能。它支持广泛的请求和响应格式。

此堆栈溢出线程触及JsonResult与Web API:MVC4 Web API or MVC3 JsonResult