【问题标题】:WCF OperationContract - What's the point of Action and ReplyAction?WCF OperationContract - Action 和 ReplyAction 的意义何在?
【发布时间】:2011-06-24 15:57:17
【问题描述】:
[ServiceContract(Namespace = "http://schemas.mycompany.com/", Name = "MyService")]
public interface IMyService
{
    [OperationContract(Name = "MyOperation")
    OperationResponse MyOperation(OperationRequest request);
}

在这种情况下,ActionReplyAction 的意义何在?


编辑:我应该澄清我的问题...

如果我不指定这些部分,我的 wsdl 会有什么不同?它不会只是使用命名空间、服务名称和操作名称的某种组合吗?

【问题讨论】:

    标签: wcf soap action reply operationcontract


    【解决方案1】:

    如果您想在消息中自定义这些值(并且它们反映在 WSDL 中),您只需要 Action / ReplyAction 属性。如果没有,则默认为 <serviceContractNamespace> + <serviceContractName> + <operationName> 用于操作,<serviceContractNamespace> + <serviceContractName> + <operationName> + "Response" 用于回复操作。

    下面的代码打印出服务中所有操作的 Action/ReplyAction 属性。

    public class StackOverflow_6470463
    {
        [ServiceContract(Namespace = "http://schemas.mycompany.com/", Name = "MyService")]
        public interface IMyService
        {
            [OperationContract(Name = "MyOperation")]
            string MyOperation(string request);
        }
        public class Service : IMyService
        {
            public string MyOperation(string request) { return request; }
        }
        public static void Test()
        {
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
            ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
            host.AddServiceEndpoint(typeof(IMyService), new BasicHttpBinding(), "");
            host.Open();
            Console.WriteLine("Host opened");
    
            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
            {
                Console.WriteLine("Endpoint: {0}", endpoint.Name);
                foreach (var operation in endpoint.Contract.Operations)
                {
                    Console.WriteLine("  Operation: {0}", operation.Name);
                    Console.WriteLine("    Action: {0}", operation.Messages[0].Action);
                    if (operation.Messages.Count > 1)
                    {
                        Console.WriteLine("    ReplyAction: {0}", operation.Messages[1].Action);
                    }
                }
            }
    
            Console.Write("Press ENTER to close the host");
            Console.ReadLine();
            host.Close();
        }
    }
    

    【讨论】:

    • 如果我这样做了ReplyAction = "http://schemas.mycompany.com/MyService/MyOperation",这与它自己构建它是一样的吗?
    • 不,回复操作将是"http://schemas.mycompany.com/MyService/MyOperationResponse"。我将使用如何打印出操作的操作/回复操作属性来更新答案。
    • 抱歉,我的意思是 ActionReplyAction 是一样的,但会附加“响应”。
    【解决方案2】:

    有时生成的 WSDL 并不适合您。您还可以做的一件有趣的事情是设置 Action = "*" 来创建一个无法识别的消息处理程序。

    http://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.action.aspx

    【讨论】:

    • 为什么有人要创建“无法识别的消息处理程序”?
    • 你确实难倒他,迈克尔!快2年了,他还在想这件事! :P
    • @michael 我相信它不是“无法识别的消息处理程序”,而是“无法识别的消息处理程序”。
    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多