lunes, 19 de octubre de 2015

Restful + json client (not allowed)

Al ejecutar un llamado desde Jquery a un servicio WCF Rest se genera el error  [HTTP/1.1 405 Method Not Allowed XXXms].

Para evitar esto, en el proyecto del servicio web se debe agregar al archivo Global.asax.cs lo siguiente:

 protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin""*");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Cache-Control""no-cache");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods""GET, POST");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers""Content-Type, Accept, x-requested-with");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age""1728000");
        HttpContext.Current.Response.End();
    }
}


Consumir Servicio Web mediante HttpWebRequest (evitar esquemas incompletos/corruptos)

Al implementar un cliente de un Servicio Web se presentaba un error al momento de intentar hacer el consumo desde VisualStudio, pero desde SoapUI respondía perfectamente.

Luego de analizar el esquema que describía el WSDL pude constatar que la definición del método que intentábamos consumir no existía. Pese a que se le indico esto al proveedor del servicio este dio la típica respuesta del programador fue “en mi maquina si funciona”, así que para evitar esto se optó por utilizar HttpWebRequest de .NET y así evitar los esquemas.

Para esto me valí de SoapUI para copiar el Request que este genera y el valor del Header SOAPAction (myReq.Headers.Add("SOAPAction", "")).

La función para este caso fue:

<pre class="brush:csharp">


 private System.Data.DataSet xmlResponse(string NumeroReferencia)
        {
            System.Data.DataSet ds = new System.Data.DataSet();
            try
            {
                string xml;
                xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>  <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:bce=\"http://j2ee.netbeans.org/wsdl/BpelBceSGI/BceInformacionOperacion\">" +
                       "<soapenv:Header/>" +
                       "   <soapenv:Body>" +
                       "      <bce:BceInformacionOperacionOperation>" +
                       "         <numReferenciaSgiMef>" + NumeroReferencia + "</numReferenciaSgiMef>" +
                       "      </bce:BceInformacionOperacionOperation>" +
                       "   </soapenv:Body>" +
                       "</soapenv:Envelope>";
 
                string urlconfig = "https://192.168.254.3/BceInformacionOperacionService/BceInformacionOperacionPort";
 
                string url = urlconfig;
                ////string responsestring = "";
                System.Net.HttpWebRequest myReq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] buffer = encoding.GetBytes(xml);
                string response;
                myReq.AllowWriteStreamBuffering = false;
                myReq.Method = "POST";
                myReq.ContentType = "text/xml; charset=UTF-8";
                myReq.ContentLength = buffer.Length;
                myReq.Headers.Add("SOAPAction""");
                System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender1, certificate, chain, sslPolicyErrors) => true);
 
                using (Stream post = myReq.GetRequestStream())
                {
                    post.Write(buffer, 0, buffer.Length);
                }
 
                System.Net.HttpWebResponse myResponse = (System.Net.HttpWebResponse)myReq.GetResponse();
 
                Stream responsedata = myResponse.GetResponseStream();
                StreamReader responsereader = new StreamReader(responsedata);
                response = responsereader.ReadToEnd();
 
                ds.ReadXml(new XmlTextReader(new StringReader(response)));
                myResponse.Close();
                responsereader.Close();
                responsedata.Close();
                return ds;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                ds.Dispose();
            }
        }

</pre>

Error levantando SVC en IIS8 - HTTP Error 404.17 - Not Found

Al intentar desplegar un servicio web que se encuentra en nuestro IIS se presentra el error:
HTTP Error 404.17 - Not Found
The requested content appears to be script and will not be served by the static file handler.
Para esto se debe verificar que dentro de Handler Mappings del IIS exista el Handler "svc-integrated-4.0"


En este caso existen 3 svc handlers, pero no el que necesita.
Handler
En el panel derecho arriba damos click en "Add Managed Handler...", en la ventana ingresamos:
Request path: *.svc
Type: System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
Name: svc-integrated-4.0
Click en el botón "Request Restrictions...", quitar el check de "Invoke handler only of request is mapped to:"
Con esto el servicio se desplegará.


Diego