来自Wcf数据服务客户端(继承自System.Data.Services.Client.DataServiceContext)我想调用在返回void的Wcf数据服务上定义的服务操作
[WebGet]
public void Operation()
{
// logic
}
我找到的唯一合理的方法是Execute,但是如何将它与void操作一起使用?
谢谢
答案 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();