如何使用WCF服务生成XML输出?

我已经设置了以下界面。

[ServiceContract] public interface IService1 { [OperationContract] String Ping(); } 

其实施如下。

 public class Service1 : IService1 { public string Ping(){ return "Pong"; } } 

根据VS中的测试应用程序,它在调用时正常工作。 我的问题是当我输入http:// localhost:12345 / Service1.svc (或者可能是Service1.svc?PingService.svc / Ping )时,我希望文本显示在屏幕上。 它是完全关闭还是我吠叫正确的树?

当然,“ Pong ”最终将成为XML结构。

编辑

下面的@carlosfigueira回复中提供的设置为解决方案的建议提供了一个很好的结构,但不幸的是,当我使用F5运行时,我的机器上会出现错误消息。 似乎元数据是必需的,端点也是如此。

我终于得到了完全的PO,并开始与我联系。 这就是我制作的 – 它在我的机器上工作,我希望它不是一个本地现象。 🙂

IRestService.cs – 声明,您的代码向联系客户承诺的内容

 [ServiceContract] public interface IRestService { [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "xml/{id}")] String XmlData(String id); [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "json/{id}")] String JsonData(String id); } 

RestService.svc.cs – 实现,代码实际对客户端执行的操作

 public class RestService : IRestService { public String XmlData(String id) { return "Requested XML of id " + id; } public String JsonData(String id) { return "Requested JSON of id " + id; } } 

Web.config – 配置,代码在客户端的路上处理的内容

       ...      

服务 – 描述服务性质的标签内容

    

behavior – 描述服务行为和终点的标记内容

            

Index.html – 执行程序,您的代码可以被称为

       ...   

script – 描述JavaScript中可执行文件的标记内容

 window.onload = function () { document.getElementById("xhr").onclick = function () { var xhr = new XMLHttpRequest(); xhr.onload = function () { alert(xhr.responseText); } xhr.open("GET", "RestService.svc/xml/Viltersten"); xhr.send(); } } 

style – 描述外观的标记的内容

 .clickable { text-decoration: underline; color: #0000ff; } 

body – 描述标记结构的标记的内容

  

一切都存储在一个名为DemoRest的项目中。 我创建了自己的文件来声明和实现服务,删除默认的文件。 出于空间原因,省略了using指令以及XML版本声明。

现在可以使用以下URL检索响应。

 localhost:12345/RestService.svc/xml/Konrad localhost:12345/RestService.svc/json/Viltersten 
  1. 还有其他人让它上class吗?
  2. 有关改进或澄清的任何建议吗?

如果将服务端点定义为WebHttp端点(也称为REST端点),您将获得所需的服务。 最简单的方法是在svc文件中使用WebServiceHostFactory

Service1.svc。

 <%@ ServiceHost Language="C#" Debug="true" Service="YourNamespace.Service1" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %> 

或者您可以在没有工厂的情况下定义端点,方法是定义它将使用webHttpBinding并具有行为:

               

更新 :由于有些人遇到问题,我写了一个完整的例子,使用XMLHttpRequest与上面列出的服务进行通信。 代码可以在https://github.com/carlosfigueira/WCFQuickSamples/tree/master/WCFForums/QuickWebCode1 (查找StackOverflow_13345557)找到,它主要列在这里。

服务代码 (注意我使用JSON作为响应,但XML也可以正常工作):

 namespace StackOverflow_13345557 { [ServiceContract] public interface IService1 { [WebGet(ResponseFormat = WebMessageFormat.Json)] string Ping(); [WebGet(ResponseFormat = WebMessageFormat.Json)] string PingWithParameters(int a, string b); } public class Service1 : IService1 { public string Ping() { return "Hello"; } public string PingWithParameters(int a, string b) { return string.Format("Hello {0} - {1}", a, b); } } } 

.SVC文件 – 注意没有使用Factory属性,因为我通过配置定义了端点:

 <%@ ServiceHost Language="C#" Debug="true" Service="StackOverflow_13345557.Service1" CodeBehind="StackOverflow_13345557.svc.cs" %> 

web.config

                    

HTML页面访问服务 (仅限正文):

   

还有一个更新 :使用上面列出的代码在https://skydrive.live.com/redir?resid=99984BBBEC66D789!6355添加了一个独立的最小项目。