2009-02-04 35 views
5

Vì vậy, đây là một giao diện siêu đơn giản để làm phần còn lại trong WCF.Tham số REST WCF không thể chứa dấu chấm?

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

Nó hoạt động tuyệt vời, cho đến khi tôi cố gắng chuyển một chuỗi có dấu chấm trong đó, chẳng hạn như tên DNS ... Tôi nhận được 404 trong asp.net.

Thay đổi UriTemplate để gắn các tham số vào chuỗi truy vấn khiến cho sự cố không còn nữa. Bất cứ ai khác nhìn thấy điều này hoặc có một workaround?

+0

+1 cho đề xuất chuỗi truy vấn. Các khoảng thời gian hoạt động tốt ở bất kỳ đâu trong yêu cầu, ngoại trừ ở cuối. –

+1

UriTemplate (và URL) trông như thế nào khi bạn gắn các tham số vào chuỗi truy vấn? – dumbledad

Trả lời

3

Điều đó đúng là phần đường dẫn không thể chứa dấu chấm hoặc nhiều ký tự đặc biệt khác cho vấn đề đó. Tôi đã trải qua cùng một vấn đề trong khi trở lại và nhận được câu trả lời từ nhóm TechNet cho biết rằng chuỗi truy vấn là lựa chọn duy nhất của bạn mà bạn có thể tìm thấy. Xin lỗi

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/d03c8331-1e98-4d5d-82a7-390942a93012/

1

Tôi có một dịch vụ với gần như chữ ký chính xác. Tôi có thể chuyển các giá trị có dấu "." trong tên. Ví dụ, điều này sẽ làm việc trên mỏ:

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

với url http://localhost/MyService.svc/category/test.category tôi nhận được giá trị ` "test.category" thông qua tại như giá trị chuỗi.

Vì vậy, phải có một số vấn đề khác. bạn truy cập vào URL như thế nào? chỉ trực tiếp trong trình duyệt? Hoặc qua cuộc gọi javascript? Chỉ cần tự hỏi nếu nó là một số lỗi ở phía khách hàng. Máy chủ chuyển giá trị tốt. Tôi khuyên bạn nên thử truy cập url trong trình duyệt của mình và nếu nó không hoạt động thì hãy đăng chính xác URL bạn đang sử dụng và thông báo lỗi là gì.

Ngoài ra, bạn có đang sử dụng WCF 3.5 SP1 hoặc chỉ WCF 3.5 không? Trong cuốn sách RESTFul .Net tôi đang đọc, tôi thấy có một số thay đổi liên quan đến UriTemplate.

Và cuối cùng, tôi đã sửa đổi một Dịch vụ đơn giản từ sách RESTFul .Net hoạt động và tôi nhận được phản hồi chính xác.

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

Đối với các cú đá, tôi đã thử giao diện của bạn trong trường hợp nó liên quan đến trả về kiểu luồng và tôi vẫn nhận được 404 từ asp.net cho http: //localhost/Software.svc/category/test.category Đó là một URL đến qua thanh địa chỉ. Nếu nói đến nó, tôi sẽ nấu một IHttpModule hoạt động xung quanh lỗi. –

1

Đây là ví dụ HttpModule sửa lỗi 'khoảng thời gian' khi chúng xuất hiện trong tham số REST. Lưu ý rằng tôi đã chỉ thấy điều này xảy ra trong máy chủ phát triển (còn gọi là Cassini), trong IIS7 nó dường như làm việc mà không có "hack" này. Ví dụ tôi đã đưa vào bên dưới cũng thay thế phần mở rộng của tệp '.svc' mà tôi đã thích nghi từ câu trả lời này. 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 có thể được định cấu hình để không cho phép rõ ràng các khoảng thời gian trên url sau phần mở rộng: http://support.microsoft.com/kb/326444/EN-US/ do đó khoảng thời gian có thể không hoạt động trên IIS. Nhìn vào tùy chọn AllowDotInPath = 0 –

Các vấn đề liên quan