2013-08-06 42 views
21

Tôi có một bộ điều khiển WebAPI với một phương pháp mà trông giống như ví dụ:phương pháp WebAPI với tham số địa chỉ email trả 404 từ HttpClient

[HttpGet] 
[AcceptVerbs("GET")] 
public HttpResponseMessage Run(string reportName, int someId, string someText, DateTime asOfDate, string username) 

Tôi có một lộ trình tùy chỉnh cấu hình đặc biệt cho hành động này. Khi tôi điều hướng trình duyệt của tôi với dịch vụ web, mọi thứ hoạt động tốt, và các biện pháp thích hợp được thực hiện:

http://localhost:xxxx/ControllerName/Run/asdf/1/asdf/07-01-2012/[email protected] 

Tuy nhiên, khi tôi cố gắng để programatically gọi dịch vụ web bằng cách sử dụng HttpClient và thực hiện một "Nhận" tôi nhận được lỗi 404. Tôi không gặp lỗi khi tham số tên người dùng không phải là địa chỉ email. Ví dụ: khi tên người dùng chỉ là "người dùng", mọi thứ đều hoạt động tốt. Đây là mã mẫu:

var url = "http://localhost:xxxx/ControllerName/Run/asdf/1/asdf/07-01-2012/[email protected]" 
var client = new System.Net.Http.HttpClient(); 
var response = client.Get(url); 

//fails here with 404 error 
response.EnsureSuccessStatusCode(); 

Tôi đã cố gắng UrlCung cấp địa chỉ email không có may mắn. Mọi lời khuyên đều được đánh giá cao.

+0

Thử thay thế @ bằng% 40 -Edit- Chỉ cần đoán ngẫu nhiên hoàn toàn. -Edit2- UrlEncoding nên đã chuyển nó cho bạn vì vậy nếu những gì tôi nói với bạn làm việc, bạn có thể muốn kiểm tra tại cách bạn sử dụng UrlEncoding và các thông số có thể. – Pluc

+2

Xét đến sự phức tạp của yêu cầu của bạn, bạn có thể muốn sử dụng động từ 'POST' và gửi một đối tượng phức tạp tùy chỉnh thay thế. Sau đó, bạn cũng bỏ qua một số vấn đề khác, chẳng hạn như không thể vượt qua ký tự '/' trong bất kỳ chuỗi nào. – user1908061

+0

@Pluc, tôi đã đưa ra đề xuất của bạn một cảnh quay không thành công như mong đợi vì đó chính xác là những gì urlecode đang làm. Cảm ơn tho. –

Trả lời

23

Chỉ cần suy nghĩ nhanh ... liệu ".com" có thể gây ra sự cố không?

+18

Wow, cảm ơn! Nó thực sự là '.' ký tự gây ra sự cố chứ không phải ký hiệu '@'. Sau khi xem bài đăng này: http://stackoverflow.com/questions/13298542/apicontroller-returns-404-when-id-contains-period Tôi vừa thêm dấu '/' trong tuyến đường vào thông số cuối cùng và Nó hoạt động như một say mê. –

15

Điều này là do IIS đang cố gắng ánh xạ các ký tự đặc biệt. Thêm dòng sau vào web.config nên khắc phục vấn đề:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

biết thêm thông tin ở đây: http://www.iis.net/configreference/system.webserver/modules

+0

Đây là bản sửa lỗi tôi nghĩ chúng tôi sẽ đi cùng, mặc dù tôi muốn xem liệu có bất kỳ vấn đề nào khác có thể phát sinh do nó không. – Codeacula

+0

@Codeacula ở hiệu suất kém nhất vì các mô-đun được quản lý sẽ được sử dụng để phân phát nội dung tĩnh. Đây sẽ là một điều tốt nếu nội dung yêu cầu bất kỳ loại xác thực nào. – user2320464

0

Bạn cần một truy vấn URL cơ bản.

[Route("api/emails")] 
public HttpResponseMessage Run(string email) {...} 

GET api/[email protected]