C# 如何使用WCF服务生成XML输出?
我已经设置了以下界面C# 如何使用WCF服务生成XML输出?,c#,wcf,web-services,C#,Wcf,Web Services,我已经设置了以下界面 [ServiceContract] public interface IService1 { [OperationContract] String Ping(); } 其执行情况如下 public class Service1 : IService1 { public string Ping(){ return "Pong"; } } 根据VS中的测试应用程序,它在被调用时工作正常。我的问题是,我希望文本在键入时显示在屏幕上http://localhost:
[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运行时会出现错误消息。元数据似乎是必需的,对于端点也是如此。如果您将服务端点定义为WebHttp端点(又称REST端点),您将得到您想要的。最简单的方法是在svc文件中使用
WebServiceHostFactory
:
服务1.svc
<%@ ServiceHost Language="C#" Debug="true" Service="YourNamespace.Service1"
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
更新:由于有些人遇到了问题,我编写了一个完整的示例,使用XMLHttpRequest
与上面列出的服务对话。代码可以在(查找StackOverflow_13345557)中找到,这里主要列出了它
服务代码(请注意,我使用JSON作为响应,但XML也同样适用):
.SVC文件-注意不要使用工厂
属性,因为我是通过配置定义端点的:
<%@ ServiceHost Language="C#" Debug="true" Service="StackOverflow_13345557.Service1"
CodeBehind="StackOverflow_13345557.svc.cs" %>
web.config:
<system.serviceModel>
<services>
<service name="StackOverflow_13345557.Service1">
<endpoint address=""
behaviorConfiguration="WithWebHttp"
binding="webHttpBinding"
bindingConfiguration="WithJSONP"
contract="StackOverflow_13345557.IService1" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="WithWebHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="WithJSONP" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
</system.serviceModel>
HTML页面访问服务(仅正文):
函数StackOverflow_13345557_测试(密码参数){
var baseUrl=“/StackOverflow_13345557.svc”;
var cacheBuster=new Date().getTime();//防止缓存响应;仅限开发
var-url;
if(密码参数){
url=baseUrl+“/PingWithParameters?a=123&b=john+doe&\=“+cacheBuster;
}否则{
url=baseUrl+“/Ping?=“+cacheBuster;
}
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
document.getElementById(“结果”).innerText=xhr.responseText;
}
}
xhr.open('GET',url,true);
xhr.send();
}
再更新一次:使用上面列出的代码在添加了一个独立的、最小的项目。我最终获得了全部订单,并开始了业务全面联系。这就是我生产的产品——它在我的机器上工作,我希望这不是本地现象。:) 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-配置,即在发送到客户端的过程中处理的代码
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;
}
}
...
服务-描述服务性质的标记内容
行为-描述服务和端点行为的标记内容
Index.html-执行者,您的代码可以被称为
...
...
...
script—用JavaScript描述可执行文件的标记内容
window.onload=函数(){
document.getElementById(“xhr”).onclick=function(){
var xhr=new XMLHttpRequest();
xhr.onload=函数(){alert(xhr.responseText);}
open(“GET”、“RestService.svc/xml/Viltersten”);
xhr.send();
}
}
style—描述外观的标记的内容
。可点击
{
文字装饰:下划线;
颜色:#0000ff;
}
body—描述标记结构的标记的内容
- XML输出
- JSON输出
- 这里是XHR输出
所有内容都存储在名为DemoRest
的项目中。我为服务的声明和实现创建了自己的文件,删除了默认文件。由于空间原因,省略了使用的指令以及XML版本声明
现在可以使用以下URL检索响应
localhost:12345/RestService.svc/xml/Konrad
localhost:12345/RestService.svc/json/Viltersten
可能复制@Adriano,甚至不接近那个帖子。要么我看错了,要么你看错了我的。:)您需要通过浏览器调用函数(可能使用AJAX?!),对吗?它说明了如何使用,并给出了一个必须使用的URI示例(请阅读所有答案)。如果您的结果是XML/JSON或纯字符串,那么这并不重要。如果你还需要别的东西,请纠正我!啊,我还没有WCF服务(还!),也没有设置任何HTTP绑定(或者我是在不知不觉中设置的),所以我在操作后放弃了。糟糕的是,我应该读更多。尽管如此,我仍然不确定我在做什么,@carlosfiguera发布的东西让我现在想哭。我理解被否决的帖子,但显然这不是一个完全令人满意的解决方案。carlos的方法是正确的,你不能逃避以某种方式配置服务(它需要一个端点!)。唯一不需要这样做的情况是,如果你的方法不是一个独立的web服务,而是一个web站点,而Ping()只是一个从JavaScript调用的方法。。。我将在另一台服务器上运行JS驱动的
XmlHttpRequest
来公开XML。由于CORS问题,我可能也需要设置标题。实现t的最简单方法
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;
}
}
localhost:12345/RestService.svc/xml/Konrad
localhost:12345/RestService.svc/json/Viltersten