WCF OperationContract-в чем смысл действия и ответа?

[ServiceContract(Namespace = "http://schemas.mycompany.com/", Name = "MyService")]
public interface IMyService
{
    [OperationContract(Name = "MyOperation")
    OperationResponse MyOperation(OperationRequest request);
}

в этом сценарии, в чем смысл Action и ReplyAction ?


Edit: я должен уточнить свой вопрос...

как будет отличаться мой wsdl, если я не укажу эти части? Не просто использовать пространства имен, имя сервиса и имя в любом случае операция?

3 ответов


вам нужны только свойства Action / ReplyAction, если вы хотите настроить эти значения в сообщениях (и они отражены в WSDL). Если у вас их нет, значение по умолчанию <serviceContractNamespace> + <serviceContractName> + <operationName> для действий, и <serviceContractNamespace> + <serviceContractName> + <operationName> + "Response" для ReplyAction.

приведенный ниже код выводит свойства 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();
    }
}

иногда сгенерированный WSDL просто не подходит для вас. Одна интересная вещь, которую вы также можете сделать, это установить Action = " * " для создания нераспознанного обработчика сообщений.

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


действие определяет входной uri для операции soap для вашего метода обслуживания.

ReplyAction определяет выходной uri для метода сервиса.

Они в основном используются для настройки URI для обоих.

 [ServiceContract]
 public partial interface IServiceContract
 {
    [OperationContract(
            Action = "http://mynamspace/v1/IServiceContract/Input/ServiceMethod",
            ReplyAction = "http://mynamspace/v1/IServiceContract/Output/ServiceMethod")]
    SomeResponseType ServiceMethod(SomeRequestType x);

в вашем wsdl вы увидите

 <wsdl:portType name="IServiceContract">
    <wsdl:operation name="ServiceMethod">
    <wsdl:input wsaw:Action="http://mynamspace/v1/IServiceContract/Input/ServiceMethod" name="SomeRequestType" message="tns:SomeRequestType " /> 
    <wsdl:output wsaw:Action="http://mynamspace/v1/IServiceContract/Output/ServiceMethod" name="SomeResponseType" message="tns:SomeResponseType " />