【问题标题】:Consuming a void service operation in a WCF data service在 WCF 数据服务中使用 void 服务操作
【发布时间】:2012-05-16 17:20:57
【问题描述】:

从 Wcf 数据服务客户端(继承自 System.Data.Services.Client.DataServiceContext)我想调用在返回 void 的 Wcf 数据服务上定义的服务操作

[WebGet]
public void Operation()
{
  // logic
}

我找到的唯一合理的方法是 Execute,但我如何将它与 void 操作一起使用?

谢谢

【问题讨论】:

    标签: c# wcf wcf-data-services


    【解决方案1】:

    您可以只使用普通的 HttpWebRequest 来执行此操作。我认为它需要是 POST 服务操作(因为 GET 会假设一些响应,但是由于您将其声明为 void 它将没有响应)。在这种情况下,无论如何都不能使用 Execute(因为它总是发出 GET 请求)。 使用普通的 HttpWebRequest 只需向服务操作 URL 发出一个简单的 POST 并检查响应状态代码(应该是 204 No Content)。 目前 WCF 数据服务没有原生客户端支持服务操作,所以需要自己写一个。

    【讨论】:

      【解决方案2】:

      我找到了解决此问题的方法。 这个网站之前解决了我很多问题,所以我认为很高兴分享回来。

      您的问题的快速回答是:

       string empty = context.Execute<string>(new Uri("Operation", UriKind.Relative)).FirstOrDefault();
      

      响应时“空”字符串应为空或空。它“解决”了上面帖子中提到的 HttpWebRequest 方法。

      此外,还可以使用此技术恢复原始类型。 假设我有这个方法:

      [WebGet]
      public bool Authenticate(string Username, string Password)
      {...do stuff here...}
      

      当您尝试正常执行时,它会失败(Vitek Karas 在上面的回复中很好地解释了这一点):

          var query = context.CreateQuery<bool>("Authenticate").AddQueryOption("Username", "'itye'").AddQueryOption("Password","'123456'");
      DataServiceCollection<bool> list = new DataServiceCollection<bool>();
      list.Load(query);
      

      但以下方法可以解决问题:

      var query = context.CreateQuery<bool>("Authenticate").AddQueryOption("Username", "'itye'").AddQueryOption("Password","'123456'");
      
      bool authenticated = context.Execute<bool>(new Uri(query.RequestUri.ToString().Replace("Authenticate()", "Authenticate"))).FirstOrDefault();
      

      请注意 Replace("Authenticate()", "Authenticate"),它在查询字符串中省略了 ()(否则会导致错误)。

      希望对您有所帮助。 - 伊耶

      【讨论】:

        【解决方案3】:

        谢谢 Itye 我正在寻找类似的解决方案。首先使用 HttpWebRequest 方式。但是你的两行代码帮助我完成了同样的任务。很高兴。再次感谢.. var query = context.CreateQuery("Authenticate").AddQueryOption("Username", "'itye'").AddQueryOption("Password","'123456'");

        bool authenticated = context.Execute(new Uri(query.RequestUri.ToString().Replace("Authenticate()", "Authenticate"))).FirstOrDefault();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 1970-01-01
          相关资源
          最近更新 更多