2009-02-04 25 views
5

Así que aquí hay una interfaz muy simple para descansar en WCF.Los parámetros WCF REST no pueden contener puntos?

[ServiceContract] 
    public interface IRestTest 
    { 
     [OperationContract] 
     [WebGet(UriTemplate="Operation/{value}")] 
     System.IO.Stream Operation(string value); 
    } 

Funciona muy bien, hasta que trato de pasar una cadena con períodos en que, como un nombre DNS ... me sale un error 404 de asp.net.

Cambiar el UriTemplate para pegar los parámetros en la cadena de consulta hace que el problema desaparezca. ¿Alguien más ve esto o tiene una solución alternativa?

+0

+1 para la sugerencia de cadena de consulta. Los períodos funcionaron bien en cualquier parte de la solicitud, excepto al final. –

+1

¿Cómo se ve la UriTemplate (y la URL) cuando se pegan parámetros en la cadena de consulta? – dumbledad

Respuesta

1

Tengo un servicio casi con la firma exacta. Puedo pasar valores que tienen un "." en el nombre. Por ejemplo, esto funcionaría en la mía:

[OperationContract] 
[WebGet(UriTemplate = "category/{id}")] 
string category(string id); 

con la url http://localhost/MyService.svc/category/test.category consigo el valor ` "test.category" pasa como el valor de cadena.

Debe haber algún otro problema. ¿Cómo estás accediendo a la URL? solo directamente en el navegador? ¿O a través de una llamada javascript? Solo me pregunto si es algún error en el lado del cliente. El servidor pasa el valor muy bien. Recomendaría intentar acceder a la URL en su navegador, y si no funciona, publique exactamente qué URL está utilizando y cuál fue el mensaje de error.

Además, ¿está utilizando WCF 3.5 SP1 o solo WCF 3.5? En el libro de RESTFul .Net que estoy leyendo, veo que hubo algunos cambios con respecto a UriTemplate.

Y finalmente, modifiqué un servicio simple del libro RESTFul .Net que funciona y obtengo la respuesta correcta.

class Program 
{ 
    static void Main(string[] args) 
    { 
     var binding = new WebHttpBinding(); 
     var sh = new WebServiceHost(typeof(TestService)); 
     sh.AddServiceEndpoint(typeof(TestService), 
      binding, 
      "http://localhost:8889/TestHttp"); 
     sh.Open(); 
     Console.WriteLine("Simple HTTP Service Listening"); 
     Console.WriteLine("Press enter to stop service"); 
     Console.ReadLine(); 
    } 
} 

[ServiceContract] 
public class TestService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "category/{id}")] 
    public string category(string id) 
    { 
     return "got '" + id + "'"; 
    } 
} 
+0

Para las patadas, probé su interfaz en caso de que esté relacionada con el retorno de tipo Stream, y todavía obtengo un 404 de asp.net para http: //localhost/Software.svc/category/test.category Es una URL que entra a través de la barra de direcciones. Si se trata de eso, cocinaré un IHttpModule que funciona alrededor del error. –

1

Aquí hay un ejemplo HttpModule que corrige el 'período' cuando se producen en los parámetros REST. Tenga en cuenta que solo he visto esto suceder en el servidor de desarrollo (también conocido como Cassini), en IIS7 parece funcionar sin este "truco". El ejemplo que he incluido a continuación también reemplaza la extensión de archivo '.svc' que he adaptado de esta respuesta. How to remove thie “.svc” extension in RESTful WCF service?

public class RestModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += 
      delegate 
      { 
       HttpContext ctx = HttpContext.Current; 
       string path = ctx.Request.AppRelativeCurrentExecutionFilePath; 

       int i = path.IndexOf('/', 2); 
       if (i > 0) 
       { 
        int j = path.IndexOf(".svc", 2); 
        if (j < 0) 
        { 
         RewritePath(ctx, path, i, ".svc"); 
        } 
        else 
        { 
         RewritePath(ctx, path, j + 4, ""); 
        } 
       } 
      }; 
    } 

    private void RewritePath(HttpContext ctx, string path, int index, string suffix) 
    { 
     string svc = path.Substring(0, index) + suffix; 
     string rest = path.Substring(index); 
     if (!rest.EndsWith(ctx.Request.PathInfo)) 
     { 
      rest += ctx.Request.PathInfo; 
     } 
     string qs = ctx.Request.QueryString.ToString(); 
     ctx.RewritePath(svc, rest, qs, false); 
    } 
} 
+0

IIS se puede configurar para rechazar explícitamente períodos en la url después de la extensión: http://support.microsoft.com/kb/326444/EN-US/ por lo tanto, el período podría no funcionar en IIS tampoco. Mire la opción AllowDotInPath = 0 –

Cuestiones relacionadas