使用相同的输入参数定义数据协定

时间:2011-07-01 13:26:59

标签: c# wcf

是否可以使用相同的参数定义两个操作合约?我想让相同的端点在post和get上做不同的事情。我的代码在

之下
 [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "MAC/{input}")]
    string MAC(string input);

    [OperationContract]
    [WebInvoke(Method = "POST",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "MAC/{input}")]
    Datalayer.Datacontracts.WebserviceMessage MAC(string input);

2 个答案:

答案 0 :(得分:2)

同名? NO。

使用您提到的相同参数是可能的。但不是同名。

服务遵循以文档为中心的范例;所以在设计服务时,我们应该摆脱面向对象的思维。不要考虑多态,重载或覆盖。

服务的元数据必须作为文档共享,甚至是非面向对象的系统/平台(以支持互操作性)。

答案 1 :(得分:-1)

除了SaravananArumugam所说的内容之外 - 你所拥有的代码甚至都没有编译(你不能在同一个界面中使用同名的两个方法,它们的唯一区别就是返回类型)。但是,您可以更改方法名称并继续使用相同的UriTemplate - 您将拥有一个具有相同名称的“虚拟”方法(即,客户端使用的地址将是相同的 - 如下例所示。

还有一件事:您不应该使用[WebInvoke(Method =“GET”)],而是使用[WebGet]。

public class StackOverflow_6548562
{
    public class WebserviceMessage
    {
        public string Data;
    }

    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "MAC/{input}")]
        string MAC_Get(string input);

        [OperationContract]
        [WebInvoke(Method = "POST",
            ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "MAC/{input}")]
        WebserviceMessage MAC_Post(string input);
    }

    public class Service : ITest
    {
        public string MAC_Get(string input)
        {
            return input;
        }

        public WebserviceMessage MAC_Post(string input)
        {
            return new WebserviceMessage { Data = input };
        }
    }

    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service/";
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        host.Open();
        Console.WriteLine("Host opened");

        WebClient c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/MAC/fromGET"));
        Console.WriteLine(c.UploadString(baseAddress + "/MAC/frompost", "POST", ""));

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}