Я интересуюсь исполнением роли известной Web Services and Wcf Services в целях интеграционного теста. С этой целью я хотел бы получить сервисные метаданные, автоматически сгенерировать сервисные тупики и сервисные тупики хоста в саморазмещенной среде.
После этой статьи здесь, я могу получить удаленные Сервисные метаданные Wcf и генерировать контракты. Однако я испытываю некоторые затруднения при выполнении того же для удаленных веб-сервисов Asmx.
У меня есть ряд решений mickey-мыши для проверки этого.
Мое решение Asmx содержит значение по умолчанию "Привет Мировой" веб-сервис, найденный ниже
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SimpleAsmxService : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld () { return "Hello World"; }
}
Мое решение Wcf содержит значение по умолчанию "Привет Мировой" сервис, также найденный ниже
[ServiceContract]
public interface ISimpleWcfService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
[DataContract]
public class CompositeType
{
[DataMember]
public bool BoolValue { get; set; }
[DataMember]
public string StringValue { get; set; }
}
public class SimpleWcfService : ISimpleWcfService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
}
Наконец, небольшой console-that-could похож
class Program
{
public const string UrlWcf =
"http://localhost:8731/Design_Time_Addresses/SimpleWcfService/mex";
public const string UrlAsmx =
"http://localhost:1803/SimpleAsmxService.asmx?WSDL";
static void Main(string[] args)
{
EndpointAddress mexAddress = new EndpointAddress (UrlWcf);
MetadataExchangeClient mexClient =
new MetadataExchangeClient (mexAddress);
mexClient.ResolveMetadataReferences = true;
// NOTE: blows up if we use UrlAsmx
MetadataSet metaSet = mexClient.GetMetadata ();
WsdlImporter importer = new WsdlImporter (metaSet);
Collection contracts =
importer.ImportAllContracts();
}
}
Мне кажется, что я должен смочь вытянуть Wsdl от известного веб-сервиса Asmx и генерировать контракты [и из контрактов для кодирования], но, может казаться, не искажаю предыдущий образец, чтобы сделать так. Любая справка очень ценилась бы,
Спасибо!
Примечание: ошибка, сгенерированная при вызове MetadataSet metaSet = mexClient.GetMetadata();
выше a System.InvalidOperationException
с сообщением
Метаданные содержат ссылку, которая не может быть разрешена: 'http://localhost:1803/SimpleAsmxService.asmx?WSDL'
С a System.InvalidOperationException
внутреннее исключение с сообщением
Sender
System.Web.Services.Protocols.SoapException: Unable to handle request without a valid action parameter. Please supply a valid soap action.
at System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteRequest()
at System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapServerMessage message)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
Чтобы заставить его работать с веб-службой ASMX, нужно указать MetadataExchangeClientMode
...
MetadataExchangeClient mexClient =
new MetadataExchangeClient (new Uri(), MetadataExchangeClientMode.HttpGet);
...
с помощью MetadataExchangeClientMode . HttpGet для ваших служб ASMX и MetadataExchangeClientMode . MetadataExchange для ваших служб WCF.