рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ GetRegions рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ Yandex рдбрд╛рдпрд░реЗрдХреНрдЯ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (WCF рдХреНрд▓рд╛рдЗрдВрдЯ)

Yandex.Direct SOAP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рдпреЛрдЬрдирд╛ рдЗрд╕ рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП WSDL рд╡рд┐рд╡рд░рдг рд╕реЗ рдпреЛрдЬрдирд╛ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреА рд╣реИред рдЕрд░реНрдерд╛рддреН, рдирд╛рдо рд╕реНрдерд╛рди рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ ("API" рдХреЗ рдмрдЬрд╛рдп " namespaces.soaplite.com/perl " рдФрд░ " xml.apache.org/xml-soap ") рдЖрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд╛рдо "рд╡рд╛рдкрд╕реА" рдХреЗ рдмрдЬрд╛рдп GetRegions рд╡рд┐рдзрд┐ рдореЗрдВ) рдЖрддрд╛ рд╣реИ "ArrayOfRegionInfo")ред

рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд╛рдорд╕реНрдерд╛рди рдХреА рд╕реЗрд╡рд╛ рдФрд░ рд╕рдорд╛рдпреЛрдЬрди рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЕрд╡рд░реЛрдзрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Reference.cs рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯ рдХреА рдЧрдИ WSDL рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЗрд╡рд▓ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░, Yandex.Direct рд╕реЗрд╡рд╛ WCF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C # рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
Yandex.Direct JSON рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдкреНрд░рд╛рд░реВрдк рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг WebClient рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг SOAP рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ, рдЬреИрд╕реЗ: рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЦреБрдж рд╕реЗ рдбреАрд░рд┐рд╢рд┐рдпрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕реЗрд╡рд╛ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рдЕрдиреБрдмрдВрдз рдХрд╛ рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред

рдЯреНрд░реЗрдирд┐рдВрдЧ

рд╕реЗрд╡рд╛ рдкреНрд░рд▓реЗрдЦрди рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред
рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:
1. рд░рдЬрд┐рд╕реНрдЯрд░ (рд▓реЙрдЧрд┐рди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП),
2. рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ (рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ application_id рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП),
3. рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдЯреЛрдХрди рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рд╕рдВрдЪрд░рдг рдХреЗ рд▓рд┐рдП),
4. рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЛрдХреЗрд▓ рдореЗрдВ рдореВрд▓реНрдп "рдЖрд░рдпреВ" рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдпрд╣рд╛рдВ рдлрд┐рд░ рд╕реЗ рди рд▓рд┐рдЦреЗрдВред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рд░реНрдорд╛рдг

1. MS Visual Studio рдореЗрдВ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВред
2. рд╕реЗрд╡рд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ, wsdl рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ: " api.direct.yandex.ru/wsdl/v4 ", рдирд╛рдорд╕реНрдерд╛рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреИрдВрдбреЗрдХреНрд╕реИрдкрд┐рд╕ рд╕рд░реНрд╡рд┐рд╕ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдЬреЛ рднреА рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реИ)ред
3. Reference.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, System.Nullable <System.DateTime> рдХреЛ System.DateTime рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
4. YandexAPIService.APIPort.GetRegions рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ Reference.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, "ArrayOfRegionInfo" рдХреЗ рд╕рд╛рде "рд╡рд╛рдкрд╕реА" рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдмрджрд▓реЗрдВред
5. рдПрдХ рдореИрд╕реЗрдЬ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗрд╡рд╛ рд╕реЗ рдЖрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ "рдЧрд▓рдд" рдирд╛рдорд╕реНрдерд╛рди рдХреЛ "рд╕рд╣реА" рдПрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

using System; using System.IO; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Configuration; using System.ServiceModel.Description; using System.ServiceModel.Dispatcher; using System.Xml; namespace YandexDirectRegions { // Client message inspector public class YandexDirectMessageInspector : IClientMessageInspector { public void AfterReceiveReply(ref Message reply, object correlationState) { XmlDocument doc = new XmlDocument(); MemoryStream ms = new MemoryStream(); XmlWriter writer = XmlWriter.Create(ms); reply.WriteMessage(writer); writer.Flush(); ms.Position = 0L; doc.Load(ms); foreach (XmlAttribute attr in doc.DocumentElement.Attributes) if (attr.Value == "http://namespaces.soaplite.com/perl" || attr.Value == "http://xml.apache.org/xml-soap") attr.Value = "API"; ms.Position = 0L; ms.SetLength(0); writer = XmlWriter.Create(ms); doc.WriteTo(writer); writer.Flush(); ms.Position = 0L; XmlReader reader = XmlReader.Create(ms); Message newReply = Message.CreateMessage(reader, int.MaxValue, reply.Version); newReply.Properties.CopyProperties(reply.Properties); newReply.Headers.CopyHeadersFrom(reply); reply = newReply; } public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel) { return null; } } // Endpoint behavior public class YandexDirectEndpointBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { // No implementation necessary } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.MessageInspectors.Add(new YandexDirectMessageInspector()); } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { // No implementation necessary } public void Validate(ServiceEndpoint endpoint) { // No implementation necessary } } // Configuration element public class YandexDirectBehaviorExtension : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(YandexDirectEndpointBehavior); } } protected override object CreateBehavior() { // Create the endpoint behavior that will insert the message // inspector into the client runtime return new YandexDirectEndpointBehavior(); } } } 


6. рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ [рдРрдк | рд╡реЗрдм] .config, рдПрдВрдбрдкреЙрдЗрдВрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="YandexDirectSoapBinding" maxReceivedMessageSize="100000"> <security mode="Transport" /> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="https://soap.direct.yandex.ru/v4/soap/" binding="basicHttpBinding" bindingConfiguration="YandexDirectSoapBinding" contract="YandexAPIService.APIPort" behaviorConfiguration="YandexDirectBehavior" name="APIPort" /> </client> <behaviors> <endpointBehaviors> <behavior name="YandexDirectBehavior"> <YandexDirectBehaviorExtension /> </behavior> </endpointBehaviors> </behaviors> <extensions> <behaviorExtensions> <add name="YandexDirectBehaviorExtension" type="YandexDirectRegions.YandexDirectBehaviorExtension, YandexDirectRegions" /> </behaviorExtensions> </extensions> </system.serviceModel> </configuration> 


7. рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ
 using System; using System.Linq; using System.ServiceModel; using System.ServiceModel.Channels; using YandexDirectRegions.YandexAPIService; namespace YandexDirectRegions { //     ,       -  / "" public class Region { public int RegionID { get; set; } public int? ParentID { get; set; } public string RegionName { get; set; } } public class UnitOfWork { YandexAPIService.APIPortClient yandexAPIPortClient; #region Singleton private static volatile UnitOfWork instance; private static object syncRoot = new Object(); private UnitOfWork() { yandexAPIPortClient = new YandexAPIService.APIPortClient(); System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; } public static UnitOfWork Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) instance = new UnitOfWork(); } } return instance; } } #endregion public Region[] GetRegions(string application_id, string token, string login, string locale) { Region[] regions = null; var applicationIdHeader = MessageHeader.CreateHeader("application_id", "ns", application_id); var tokenHeader = MessageHeader.CreateHeader("token", "ns", token); var loginHeader = MessageHeader.CreateHeader("login", "ns", login); var localeHeader = MessageHeader.CreateHeader("locale", "ns", locale); using (var scope = new OperationContextScope(yandexAPIPortClient.InnerChannel)) { OperationContext.Current.OutgoingMessageHeaders.Add(applicationIdHeader); OperationContext.Current.OutgoingMessageHeaders.Add(tokenHeader); OperationContext.Current.OutgoingMessageHeaders.Add(loginHeader); OperationContext.Current.OutgoingMessageHeaders.Add(localeHeader); var regionsInfo = yandexAPIPortClient.GetRegions(); if (regionsInfo != null) { regions = regionsInfo.Select<RegionInfo, Region>((regionInfo) => { return new Region() { RegionID = regionInfo.RegionID, ParentID = regionInfo.ParentID, RegionName = regionInfo.RegionName }; } ).ToArray(); } } return regions; } } } 

Source: https://habr.com/ru/post/In201746/


All Articles