gpt4 book ai didi

c# - 使用相同的方法进行 PUT 和 POST

转载 作者:行者123 更新时间:2023-11-30 17:52:54 25 4
gpt4 key购买 nike

我正在开发一个 WCF Rest 服务,我的 ServiceContract 上有这个:

    [OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "/users",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
User AddOrUpdateUser(User user);

[OperationContract]
[WebInvoke(Method = "PUT",
UriTemplate = "/users",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
User AddOrUpdateUser(User user);

我将使用 User AddOrUpdateUser(User user); 进行 POSTPUT:

    public User AddOrUpdateUser(User user)
{
if (user == null)
throw new ArgumentNullException("user", "AddOrUpdateUser: user is null");

using (var context = new AdnLineContext())
{
context.Entry(user).State = user.UserId == 0 ?
EntityState.Added :
EntityState.Modified;
context.SaveChanges();
}

return user;
}

我正在关注这个 pattern去做。

但是,我得到一个错误:

The type 'MyCompanyWCFService.IMyCompanyService' already contains a definition for 
'AddOrUpdateUser' with the same parameters

我该如何解决这个问题?

最佳答案

您不能有两个具有相同签名的方法 - 这是 C# 问题,而不是 WCF 问题。你基本上有两种选择去这里。第一种是有两个不同的方法,一个调用另一个,或者有第三个方法由两者调用):

public interface ITest
{
[OperationContract]
[WebInvoke(Method = "POST",
UriTemplate = "/users",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
User AddUser(User user);

[OperationContract]
[WebInvoke(Method = "PUT",
UriTemplate = "/users",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
User UpdateUser(User user);
}

和实现:

public class Service
{
public User AddUser(User user) { return AddOrUpdateUser(user); }
public User UpdateUser(User user) { return AddOrUpdateUser(user); }
private User AddOrUpdateUser(User user)
{
if (user == null)
throw new ArgumentNullException("user", "AddOrUpdateUser: user is null");

using (var context = new AdnLineContext())
{
context.Entry(user).State = user.UserId == 0 ?
EntityState.Added :
EntityState.Modified;
context.SaveChanges();
}

return user;
}
}

另一种选择是使用一个方法接受多个 HTTP 方法;您可以通过在 WebInvoke 属性上指定 Method = "*" 来做到这一点。但是如果你走那条路线,你应该在操作中验证传入的 HTTP 动词是你期望的动词之一:

public interface ITest
{
[OperationContract]
[WebInvoke(Method = "*",
UriTemplate = "/users",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
User AddOrUpdateUser(User user);
}

和实现:

public class Service
{
public User AddOrUpdateUser(User user)
{
var method = WebOperationContext.Current.IncomingRequest.Method.ToUpperInvariant();
if (method != "POST" || method != "PUT")
{
throw new WebFaultException(HttpStatusCode.MethodNotAllowed);
}

if (user == null)
throw new ArgumentNullException("user", "AddOrUpdateUser: user is null");

using (var context = new AdnLineContext())
{
context.Entry(user).State = user.UserId == 0 ?
EntityState.Added :
EntityState.Modified;
context.SaveChanges();
}

return user;
}
}

关于c# - 使用相同的方法进行 PUT 和 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18018881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com