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