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 " />