如何使用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?Ping或Service.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
- 还有其他人让它上class吗?
- 有关改进或澄清的任何建议吗?
如果将服务端点定义为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添加了一个独立的最小项目。