2013-08-02 31 views
3

我正在开发一个WCF REST服务,我有这对我的ServiceContract用同样的方法把和POST

[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 

我怎样才能解决这个问题呢?

+1

这可以通过以下一倍发布,看看是否有帮助:http://stackoverflow.com/questions/555073/enable-multiple-http-methods-on-a-single-operation – cocogorilla

+0

你有没有尝试把'WebInvoke'属性都放在同一个方法上? – Jay

回答

1

你不能有两种方法具有相同的签名 - 这是一个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; 
    } 
}