在WCF数据服务中使用void服务操作

时间:2010-07-28 13:42:33

标签: c# wcf wcf-data-services

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

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

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

谢谢

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我找到了解决此问题的方法。 这个网站以前解决了我很多问题,所以我觉得分享回来会很好。

您问题的快速回答是:

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

响应时,“empty”字符串应为null或为空。它“解决”上面帖子中提到的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”),它会从查询字符串中省略()(否则会导致错误)。

希望它有所帮助。 - Itye

答案 2 :(得分:0)

谢谢你 我一直在寻找类似的解决方案。首先使用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();