Özgür Özvarış

Bir yazılımcının kırık dökük dünyası

Web Service Soap Header Linkler

clock Mayıs 14, 2014 11:09 by author OzgurOzvaris

wcf soap Log

http://stackoverflow.com/questions/17620228/log-soap-messages-from-a-console-application

SoapExtension Walkthrough -- VS7 version

http://radio-weblogs.com/0105476/stories/2002/03/22/soapextensionWalkthroughVs7Version.html

Programmatically Insert SoapHeader into SOAP Request with ASMX SoapExtensions

http://blogs.msdn.com/b/kaevans/archive/2007/08/06/programmatically-insert-soapheader-into-soap-request-with-asmx-soapextensions.aspx

private void AddHeader(SoapMessage message)
{
    CustomSoapHeader header = new CustomSoapHeader();
    header.CastMemberID = "gsupike@hotmail.com";
    header.MustUnderstand = false;
    message.Headers.Add(header);
}

 How to: Define and Process SOAP Headers 

http://msdn.microsoft.com/en-us/library/8728chd5(v=vs.80).aspx

 How to obtain SOAP Request body in C# Web

http://desalasworks.com/article/how-to-obtain-soap-request-body-in-c-web-services/

using System;
using System.Collections.Generic;
using System.Web;
using System.Xml;
using System.IO;
using System.Text;
using System.Web.Services;
using System.Web.Services.Protocols;
 
namespace SoapRequestEcho
{
  [WebService(
  Namespace = "http://soap.request.echo.com/",
  Name = "SoapRequestEcho")]
  public class EchoWebService : WebService
  {
    [WebMethod(Description = "Echo Soap Request")]
    public XmlDocument EchoSoapRequest(int input)
    {
      // Initialize soap request XML
      XmlDocument xmlSoapRequest = new XmlDocument();
 
      // Get raw request body
      using (Stream receiveStream = HttpContext.Current.Request.InputStream)
      {
        // Move to begining of input stream and read
        receiveStream.Position = 0;
        using (StreamReader readStream = 
                               new StreamReader(receiveStream, Encoding.UTF8))
        {
          // Load into XML document
          xmlSoapRequest.Load(readStream);
        }
      }
      // Return
      return xmlSoapRequest;
    }
  }
}

 Add Request SOAP-Header to Response

We will develop a web service that would authenticate users for web sites. The web site needs to pass the user ID as well as the password for the user. Apart from this the web site also needs to pass the sites ID and password. This information is needed so that the web service can validate the site that have requested for the user authentication.

The user ID and the password will be passed through the parameters of an authenticate method exposed by the web service, while the sites ID and password will be passed using SOAP header. Since the data is very sensitive SOAP extension will be used to encrypt the data and decrypt them.

http://stackoverflow.com/questions/7321526/add-request-soap-header-to-response

http://wso2.com/library/articles/extending-axis2/

Using SOAP Header and SOAP Extensions in a Web Service

case SoapMessageStage.BeforeDeserialize:

case SoapMessageStage.BeforeDeserialize:
readStr = new StreamReader(outwardStream);
writeStr = new StreamWriter(inwardStream);
soapMsg1 = readStr.ReadToEnd();
if ( message is System.Web.Services.Protocols.SoapClientMessage)
{
  // this is executed at client side
  xDoc.LoadXml(soapMsg1);
  XmlNodeList xResult = xDoc.GetElementsByTagName("AuthenticateResult");
  xResult[0].InnerXml = decrypt(xResult[0].InnerXml);
}
else if( message is System.Web.Services.Protocols.SoapServerMessage)
{
  // this is executed at server side
  xDoc.LoadXml(soapMsg1);
  XmlNodeList xSiteID = xDoc.GetElementsByTagName("siteID");
  xSiteID[0].InnerXml = decrypt(xSiteID[0].InnerXml);
  XmlNodeList xSitePwd = xDoc.GetElementsByTagName("sitePwd");
  xSitePwd[0].InnerXml = decrypt(xSitePwd[0].InnerXml);
  XmlNodeList xUserID = xDoc.GetElementsByTagName("UserID");
  xUserID[0].InnerXml = decrypt(xUserID[0].InnerXml);
  XmlNodeList xPwd = xDoc.GetElementsByTagName("Password");
  xPwd[0].InnerXml = decrypt(xPwd[0].InnerXml);
}
soapMsg1 = xDoc.InnerXml;
writeStr.Write(soapMsg1);
writeStr.Flush();
inwardStream.Position = 0;

case SoapMessageStage.AfterSerialize: 

case SoapMessageStage.AfterSerialize:
inwardStream.Position = 0;
readStr = new StreamReader(inwardStream);
writeStr = new StreamWriter(outwardStream);
soapMsg1 = readStr.ReadToEnd();
if ( message is System.Web.Services.Protocols.SoapClientMessage)
{
  // this is executed at client side
  xDoc.LoadXml(soapMsg1);
  XmlNodeList xSiteID = xDoc.GetElementsByTagName("siteID");
  xSiteID[0].InnerXml = encrypt(xSiteID[0].InnerXml);
  XmlNodeList xSitePwd = xDoc.GetElementsByTagName("sitePwd");
  xSitePwd[0].InnerXml = encrypt(xSitePwd[0].InnerXml);
  XmlNodeList xUserID = xDoc.GetElementsByTagName("UserID");
  xUserID[0].InnerXml = encrypt(xUserID[0].InnerXml);
  XmlNodeList xPwd = xDoc.GetElementsByTagName("Password");
  xPwd[0].InnerXml = encrypt(xPwd[0].InnerXml);
}
else if( message is System.Web.Services.Protocols.SoapServerMessage)
{
  // this is executed at server side
  xDoc.LoadXml(soapMsg1);
  XmlNodeList xResult = xDoc.GetElementsByTagName("AuthenticateResult");
  xResult[0].InnerXml = encrypt(xResult[0].InnerXml);
}
soapMsg1 = xDoc.InnerXml;
writeStr.Write(soapMsg1);
writeStr.Flush();
break;

 

 

 



Jmeter

clock Şubat 14, 2014 16:14 by author OzgurOzvaris

Değerli Arkadaşlar,

Soap datalarımızın response timeları ile birtürlü baş edemiyoruz. Bizde biraz daha profesyonel bir tool bulmaya karar verdik.

Jmeter güzel bir toola benziyor.

İlk başta sadece linux ortamında çalışıyor diye üzüldük ancak sonra yaptığımız araştırmada windows ortamında da çalıştığını gördük.

Konu ile ilgili bir kaç link paylaşacağım.

http://jmeter.apache.org/

Bu işin windowstada olduğunu gösteren blog. Çıkış noktamız bu oldu.

http://desulicious.blogspot.com.tr/2012/07/jmeter-for-windows-7.html

Buradaki örnekte JMeter 2.7, JDK 1.6.0 or later ile yapmış ancak biz güncel versiyolarla başardık. Jmeter 2.11 ile çalıştırdık.

dökümanda bahsedilen zip dosyasını ilk kurduğumuzda jmeter.bat dosyası bir hata verdi "Unable to access jarfile ApacheJMeter.jar errorlevel=1" bu hata bizi biraz uğraştırdı http://stackoverflow.com/questions/10480042/how-to-resolve-the-error-unable-to-access-jarfile-apachejmeter-jar-errorlevel-1  ancak sonunda içinde ApacheJMeter.jar dosyası olan bir zip file'ı  http://www.apache.org/dist/jmeter/binaries/ linkinde bulduk burdaki zip 30mb.

Sonra artık kullanmayı anlamak kaldı. Onun için

http://aravindamadusanka.blogspot.com.tr/2012/08/how-to-use-apache-jmeter-for-web.html

güzel bir blog oldu.

Tabiki jmeter anladığımız kadarı ile çok kapsamlı bir tool ama şimdilik amacımıza ulaştık.

Sizlerede faydalı olabilr düşüncesiyle paylaşıyorum.

Herkese Selam.

 



WCF Custom Context

clock Nisan 2, 2013 15:52 by author OzgurOzvaris

Değerli Arkadaşlar,

Eski alışkanlıklar kolay bırakılmıyor.Smile Eğer sizde böyle düşünüyor ve wcf niz içinde eskiden olduğu gibi herhangi bir class library altında Httpcontext.Curent.Session["Parameter"] kullanmak isterseniz bu yöntem hoşunuza gidecektir. HttpContext benzeri bir custom context yapısı kuracağız ve bunu wcf'imize bağlayacağız.

Tabiki Kaynak

http://hyperthink.net/blog/a-simple-ish-approach-to-custom-context-in-wcf/ 

Öncelikle bir MyContext classı oluşturun bu classınproje içinde  her yerden görünmesi gerekiyor.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Infrastructure
{
    public class MyContext : IExtension<OperationContext>
    {

        //The "current" custom context

        public static MyContext Current
        {

            get { return OperationContext.Current.Extensions.Find<MyContext>(); }

        }



        #region IExtension<OperationContext> Members



        public void Attach(OperationContext owner)
        {

            //no-op

        }



        public void Detach(OperationContext owner)
        {

            //no-op

        }

        #endregion



        object contextProperty1;



        //You can have lots more of these -- this is the stuff that you 

        //want to store on your custom context

        public object ContextProperty1
        {

            get { return this.contextProperty1; }

            set { this.contextProperty1 = value; }

        }

    }
}

Şimdi geri kalan kodları wcf inizi görmesi yeterli.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;


namespace WcfServiceLib
{
    

    public class MyContextMessageInspector : IDispatchMessageInspector
    {

        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,
                                          IClientChannel channel,
                                          InstanceContext instanceContext)
        {

            OperationContext.Current.Extensions.Add(new MyContext());

            return request.Headers.MessageId;

        }



        public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {

            OperationContext.Current.Extensions.Remove(MyContext.Current);

        }

    }

    public class MyContextBehaviorAttribute : Attribute, IServiceBehavior
    {

        #region IServiceBehavior Members



        public void AddBindingParameters(ServiceDescription serviceDescription,

                                         ServiceHostBase serviceHostBase,

                                         System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,

                                         BindingParameterCollection bindingParameters)
        {

            //no-op

        }



        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {

            foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
            {

                foreach (EndpointDispatcher ed in cd.Endpoints)
                {

                    ed.DispatchRuntime.MessageInspectors.Add(new MyContextMessageInspector());

                }

            }

        }



        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {

            //no-op            

        }

        #endregion

    }

   }

Yukarıda bölümde MyContexti bir attribute ile wcf clasımıza uygulayabilir hale getirdik. Şimdi onu uyguluyoruz.

[ServiceContract]

    [MyContextBehavior]

    public class MySerivce
    {

        [OperationContract]

        public string DoStuff(string foo)
        {

            //Use MyContext.Current here to do something interesting...

            MyContext.Current.ContextProperty1 = "test";

        }

    }

Şimdi artık MyContext.Current.ContextProperty1 değerini projenin her yerinden alabilirsiniz.

 

Herkese iyi çalışmalar.



WCF servisinize IOC Container ekleme

clock Nisan 2, 2013 12:29 by author OzgurOzvaris

Değerli arkadaşlar,

Önce Kaynaklar

http://www.dimecasts.net/Casts/CastDetails/150

Episode150_WCF_AddingIoCSupportToYourServices.zip (374,68 kb)

 

Bildiğiniz üzere dependecy injection diye bir yazılım kavramı. Bu kavramı kolay uygulayabilmemiz için IOC Containerlar kullnılıyor. Bu IOC containerlardan biride StructerMap isimli bir IOC Container.

Hani olurda Web servisinizden kullanığınız metodu da abstract etmek isterseniz WCF servinizin içinde kulanılan metodu sürecin içine katabilmemiz için WCF bunu destekleyecek mekanizmalırı oluşturmuş. Yapmamız gereken WCF ile staracturemap arasında bir bağlantı oluşturup keyfimize bakmak.

Ör :

public class PatientEligibilityService : IPatientEligibilityService
    {

        public bool IsPatientEligibleForGoodCare(Patient patient)
        {
            var specification = ObjectFactory.GetInstance<IPatientEligibleForGoodCareSpecification>();

            return Specification.IsSatisfiedBy(patient);
        }

        
    }

Bir webservis metodunuda sürekli olarak Specification classının StaractureMap in factory metodu olan GetInstance metodu ile üretmek istemezseniz. Yani

public class PatientEligibilityService : IPatientEligibilityService
    {
        public IPatientEligibleForGoodCareSpecification Specification { get; set; }

        public PatientEligibilityService( IPatientEligibleForGoodCareSpecification specification )
        {
            Specification = specification;
        }

        public bool IsPatientEligibleForGoodCare(Patient patient)
        {
            //var specification = ObjectFactory.GetInstance<IPatientEligibleForGoodCareSpecification>();

            return Specification.IsSatisfiedBy(patient);
        }


       
    }

Bu şekilde kullanmak isterseniz verdiğim kaynakları dikkatlice inceleyin.

 

İyi çalışmalar.

 



Soap Webservis Test

clock Ocak 10, 2013 16:07 by author OzgurOzvaris

Değerli Arkadaşlar,

Eğer bir web servisi soap data ile test etmek ister ve request responsları açık açık görmek isterseniz bu örnek işinize yaracakatır diye tahmin ediyorum.

Önce linkleri verelim.

How to send/receive SOAP request and response using C#

How automatically remove all white spaces start or end in a string

Removing XmlDocument white space c#

Format XML String to Print Friendly XML String

Kendi Çalışmam : RequestSoap.zip (47,77 kb)

Not : Soap Action'a dikkat web servisin wsdl'lindeki gözüken pathi olduğu gibi muhakkak yazmanız gerekmektedir.

- Logladığınız yada göndermek istediğiniz soap datasını Request Soqp Data Bölümüne yazıyorsunuz. Eğer log datada aralarda boşluk var ise Temizle buttonu otomatik olarak bu boşlukları temizleyecek ve görsel olarak xml formatlayacaktır.

- Test Buttonuna bastıktan sonra sonu. Response Soap data bölümüne gelir. Görsel olarak Formatlamak için tekrar Temizle buttonuna basabilirsiniz.

Bu kadar basit.

İyi çalışmalar.



Soap Serialize ve Deserialize

clock Aralık 25, 2012 09:43 by author OzgurOzvaris

Değerli Arkadaşlar,

Geçen çok ilginç bir şeyle karşılatım bir müşterimizde web servis extensionla (Bir önceki blogumuz) logladığımız bir web servis test metodunu kendimin de test etmesi ihtiyacı oldu. Test.asmx isimli bir yeni web servise aynı metodun aynı class input ve output değerleri ile bir test metodunu oluşturdum. Ancak client tarafa web servisimi referans gösterince input ve output (io) classların bir örneğini test.asmx e ait otomatik proxy class içine kopyalandı (Bu kopyalama ile ilgili sorun bir başka wcf uygulamamda çözmüştüm. Belki ilerleyen zamanda bununla ilgili de bir örnek yaparız.). Böyle olunca server tarafında aynı io classlarını kullanmama rağmet client tarafta farklı io classlar şeklinde gözüktü.

Client taraftaki fonksyonu giriş çıkış değerlerini test'e göre ayarlamak yerine, burada bir ali cengiz oyunu yapmaya karar verdim. Aslında soap haberleşmesinde kullanılan io claslar birer soap döküman öyle ise bu classların içinde ki class isimlerini değiştirerek client tarafta minimum değişiklikle sunucu tarafı ile haberleşebilirim diye düşündüm.

Önce kaynakların linklerini vermekle başlıyayım

C# serializing/deserializing with memory stream

Using DataContractSerializer to serialize, but can't deserialize back

Kendi Çalışmam (18,71 kb)

Bu değiştiştirme işlemi bir kaç aşamadan oluşuyor.

1 - Proje içinde kullanınan gerçek classın Serialize edilmesi ve stringe dönüştürülmesi

2 - Oluşturulan class içindeki source class typenin target class tipi ile deşitirilmesi

3 - Oluşan yeni string değerin deSerialize edilerek return değerin target class tipi üzerinden alınması.

Tabi burda yine bazı sitelerden faydalandım.

Burada dikkat edilmesi gereken bir husus var. Klasik yöntemden Serialize ve deSerialize yöntemleri (kysvdy) ile bu işlemi yapamıyor olmamız çünkü kysvdy de memory stream deSerialize bit değeri artıyor. Bunun izahını verdiğim linklerde bulabilirsiniz.



Webservice trace extension

clock Aralık 19, 2012 13:35 by author OzgurOzvaris

Değerli Arkadaşlar,

Belki sizde benim gibi web service trace etmeye ihtiyaç duyabilirsiniz.

Biraz kaynak bulmakta zorlandım önce kaynakların linklerini vermekle başlıyayım.

MSDN : How to: Implement a SOAP Extension

Efficient Tracing Using SOAP Extensions in .NET

TraceExtension codeplex Sample Project

Kendi Çalışmam (292,60 kb)

 

Bildiğiniz üzere bizler gerek wcf de gerek, webservice (.asmx) uygulamalarında kullandığımız metodlarda xml tabanlı soap mesajları ile haberleşme yapıyoruz. Kullandığımız web metodların, bu mesajları kullanabilmesi için typelara çeviriyorlar. Ancak üst seviyedeki soap mesajları kullanmak için bir kaç yöntemden biride SoapExtension classından yada customize edilmesinden faydalanmak.

Bir yöntemde networku dinlemek. Araştırmam esnasında http://www.wireshark.org/ ürününü gördüm. Belki ufuk olur diye bunuda not edeyim...

 

Kendi çalışmamada web.config'e 2 adet parametre ekleniyor WsLogModuleList, SimpleLogPath isimli.

WsLogModuleList :

[TraceExtension(Filename = "C:\\wslogtest\\log.txt", ModuleName = "HelloWorld")]

ModuleName = "HelloWorld" değeri WsLogModuleList parametresinde ayrılmış şekilde bulunuyorsa bu web metod loglanıyor.

SimpleLogPath : Eğer TraceExtension bölümünde File Name ile ayrı bir path belirtilmemişse logu SimpleLogPath te belirtilen yere alır.

 İyi çalışmalar.

 

Not 1: wcf trace etmek için bu yöntemi kullanmayın. wcf için bu link belki iş görebilir. Writing a WCF Message Inspector

Not 2: web servisi test etmek için localde browserda gelen web servis test etmek için kullanılan invoke komutunu kullanmayın.

 



Hakkımızda  AboneOl 

Blog Yayınımıza Hoşgeldiniz.

Month List

RecentPosts

Sign In