Na obsah stránky

Texy RPC wrapper pro dotnet

Aleš Roubíček | | # permalink

Update 2

Protože se změnil protokol komunikace s Texy RPC a já měl i pár nápdů na vylepšení, použijte raději Texy.net RC1, je to jediná funkční verze ;)

Update

Napsal jsem knihovnu, která zprostředkovává kounikaci s Texy! XML-RPC, která je mnohem lepší než toto řešení. Najdete ji v článku Texy.net 1.0 beta

Ještě jsem ani nestihl napsat, že DGX uvolnil finální release Texy! 1.0 a včera večer přidal ještě XML RPC rozhranní pro Texy (na adrese http://xmlrpc.texy.info/). Toho jsem nemohl nevyužít k procvičení vzdáleného volání z ASP.NET. Sice to neni tak elegantní řešení jako u Texy WS, ale je tu další možnost, jak Texy do dotnetu implementovat…

using System;
using System.IO;
using System.Net;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;
using System.Text;

[WebService(
    Namespace = "http://rarous.net/ws/",
    Description = "XML RPC to SOAP bridge for Texy!")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TexyService : System.Web.Services.WebService {

    public TexyService () { }

    [WebMethod(Description = "Konvertuje vstupní text do XHTML")]
    public string ConvertToXhtml(string text)
    {
        Uri url = new Uri("http://xmlrpc.texy.info/");
        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.UserAgent = "Gryphoon Texy Bridge 0.1";
        request.Accept = "text/html, text/xml, application/xhtml+xml, application/xml";
        request.ContentType = "text/xml";
        request.Method = "POST";

        XmlTextWriter writer = new XmlTextWriter(request.GetRequestStream(), Encoding.UTF8);
        writer.WriteStartDocument();
        writer.WriteStartElement("methodCall");
            writer.WriteElementString("methodName", "texy1.toHtml");
            writer.WriteStartElement("params");
                writer.WriteStartElement("param");
                    writer.WriteStartElement("value");
                        writer.WriteElementString("string", text);
                    writer.WriteEndElement();
                writer.WriteEndElement();
            writer.WriteEndElement();
        writer.WriteEndElement();
        writer.Close();

        HttpWebResponse response = request.GetResponse() as HttpWebResponse;
        XmlTextReader reader = new XmlTextReader(response.GetResponseStream());

        string output = String.Empty;
        object val = reader.NameTable.Add("string");
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element && reader.Name.Equals(val))
                output = Server.HtmlDecode(reader.ReadInnerXml());
        }

        reader.Close();
        response.Close();

        return output;
    }
}

Rovnou jsem wrapper implementoval do Webové služby pro další využití (např. v Atlasu), ale celá magie je pouze v metodě ConvertToXhtml, která se o všechno postará. Tohle je první nástřel a možná má ještě nějaký mouchy, ale to se podá ;) Určitě chci ještě dopsat možnost konfigurace, kterou Texy RPC taky nabízí.

Ukázka služby

Našli jste v článku chybu? Máte námět na reportáž? Založte mi ticket.