pátek 23. listopadu 2012

čtvrtek 8. března 2012

WCF - RESTFULL - service - webová služba

Do našeho serveru budeme přidávat dolaší WCF službu. Tentokráte se bude jednat o služby přístupnou přes HTTP  protokol. Jedná se o klasickou webovou službu.

Podívejme se na příklad:
Vytvoříme si nový ServiceContract.
[ServiceContract]
public interface IEventService
{          
        
  [OperationContract]
  [WebGet(UriTemplate = "EventInfo/{exe_name}", ResponseFormat = WebMessageFormat.Xml)]
  EventInfo GetEventInfo(string exe_name);

}
Způsob volání přes protokol HTTP se konfiguruje pomocí atributu WebGet. Bude se jednat o volání přes HTTP příkaz GET. Kdybychom chtěli využít jiných HTTP příkazů, můžeme využít atributu WebInvoke pro jejich konfiguraci.
[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "/customer/{id}")]
public void PutCustomer(int id, Customer customer)
{
   
}
 
[OperationContract]
[WebInvoke(Method = "DELETE", UriTemplate = "/customer/{id}")]
public void DeleteCustomer(int id)
{
  
        
}
Podívejme zpět se na první příklad, kde funkce GetEventInfo vrací třídu EventInfo. Zajisté vás zajímá, v jakém formátu se vrátí odpověď od serveru. Formát si můžete přepnout buď přepínačem ResponseFormat = WebMessageFormat.Xml nebo přepínačem ResponseFormat = WebMessageFormat.Json. Zaměřme se na XML formát. Mám jednoduchou třídu:
[DataContract]    
public class EventInfo
{   
  [DataMember]
  public string Name
  {
    get;            
    set;            
  }
}
Server mi vrátí XML a názvy tagů jsou totožné z názvy tříd. Server vrátí výsledné XML jako:
<EventInfo>
<Name>AKCE</Name>
</EventInfo>
To je dobré, ale často mohu potřebovat pojmenovat tagy nějakým vlastním jménem. Jakým způsobem mohu ovlivnit názvy tagů?
[DataContract(Name="MyEventInfo")]    
public class EventInfo
{   
  [DataMember(Name="Jmeno")]
  public string Name
  {
    get;            
    set;            
  }
}

Pokud do atributu DataContract přidáte parametr Name, dostane tag ve výstupním XML toto jméno. To samé se stane, když přidáte parametr Name do atributu DataMember.Ze serveru se mi vrátí XML:
<MyEventInfo xmlns="http://schemas.datacontract.org/2004/07/WCF8bcPgServices" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Jmeno>AKCE</Jmeno>
</MyEventInfo>
To je vše přátelé.

pátek 24. února 2012

WEB Request - GET

Potřeboval jsem zavolat jednoduchou službu na webu, kde jsem přes URL předal parametry. K tomu mi postačí HTTP dotaz typu GET.

WebRequest request = WebRequest.Create(service + invoke);
request.Method = "GET";
using (WebResponse response = request.GetResponse())
{
  using (Stream stream = response.GetResponseStream())
  {
    XmlTextReader reader = new XmlTextReader(stream);                    
  }
}

URL jsem si rozděli na URL služby - service a parametry volání - invoke. Dejte pozor na nepovolené znaky. Před odeslání prožeňte parametry url encoderem, který vám nahradí nepovolené znaky.

System.Web.HttpUtility.UrlEncode(url_encode);

Na straně serveru si nezapomeňte parametry dekódovat zpět.

System.Web.HttpUtility.UrlDecode(pars);

čtvrtek 26. ledna 2012

WPF DataGrid - scrollovaní na pozici

Ve WPF DataGridu jsem potřeboval zobrazit jednu položku která je kdekoliv v tabulce. Tabulka má hodně řádků a já chci do zobrazení dostat nějaký řádek, který není vidět.

Je to velice jednoduché:

datagrid.ScrollIntoView(next);

Položka se zviditelní, ale bohužel se může objevit kdekoliv v pohledu. Může se zobrazit na první zobrazené pozici nebo naopak na poslední pozici. To se děje podle toho, jestli scrollujete nahoru nebo dolu. Je to užitečná funkce, ale já jsem dostal v práci zadání, že zobrazená položka musí být na první zobrazené pozici. Jak na to? Dlouho jsem pátral po tom, jakým způsobem se mám napíchnout na scrollbar uvnitř gridu, a také jsem si myslil, že to ani není možné. Dnes jsem našel kód, který vyhledá srollbary přes vizuální strom. Já jsem hledal chybně scrollbary, ale měl jsem hledat tzv. ScrollViewer.

Příklad funkce, která vrátí ScrollViewer:
private static ScrollViewer GetScrollbar(DependencyObject dep)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++)
    {
        var child = VisualTreeHelper.GetChild(dep, i);
        if (child != null && child is ScrollViewer)
            return child as ScrollViewer;
        else
        {
            ScrollViewer sub = GetScrollbar(child);
            if (sub != null)
                return sub;
        }
    }
    return null;
}