2010-08-11 59 views
8

Tôi đang cố gắng thực hiện HTTP DELETE trong C# từ mã của tôi phía sau và không thể thực hiện việc này. Sau khi nhìn vào các thành viên của loại WebRequestMethods.Http, tôi thậm chí không chắc chắn rằng điều này là có thể.Yêu cầu DELETE HTTP

Đây là mã của tôi:

try 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/NameFiles/00000.txt"); 
    request.Method = "DELETE"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     // some code 
    } 
} 
catch (Exception ex) 
{ 
    ex.ToString(); 
} 

Chạy này từ môi trường phát triển của tôi, tôi nhận được: "Các máy chủ từ xa trở về một lỗi:. (401) trái phép"

Tôi đã nhận được kết quả khác trên máy chủ mà tôi cho rằng có liên quan đến cài đặt trong IIS: "Máy chủ từ xa đã trả về lỗi: (501) Chưa được triển khai".

Ngoài ra, như tôi đã đề cập trong nhận xét cho câu trả lời bên dưới, tôi có thể gửi yêu cầu DELETE từ trang asp cổ điển bằng cách sử dụng vbscript trên cùng một máy chủ đến cùng một vị trí như yêu cầu từ trang aspx của tôi bằng C#. Tại sao chúng lại khác nhau?

+1

HTTP DELETE là ** cực kỳ ** bí truyền. Rất ít máy chủ web hỗ trợ nó. (vì lý do tốt!) –

+0

@Kirk Woll - Tôi có thể làm điều này trên cùng một máy chủ với một trang asp cổ điển bằng cách sử dụng VBScript. –

+6

Chính xác như thế nào là "bí truyền"? –

Trả lời

0

401 có nghĩa là máy chủ yêu cầu bạn xác thực (có thể nó cho phép truy cập ẩn danh chỉ cho các hoạt động đọc)?

Bên cạnh đó, bạn có thể muốn loại bỏ các tiêu đề Content-Type, trừ khi bạn thực sự có kế hoạch gửi một cơ thể với yêu cầu (đó sẽ là không chính thống cho DELETE ...)

+0

Tôi sẽ cố gắng tìm ra nếu tôi cần xác thực. Bất kỳ ý tưởng những gì sự khác biệt sẽ là tại sao tôi có thể gửi yêu cầu DELETE với asp/vbscript cổ điển và không aspx/csharp của tôi? Tôi cũng không xác thực. –

+0

Trong các trường hợp như thế này, câu trả lời thường xuyên là: vì máy chủ §% & "% § nhìn vào trường tiêu đề Tác nhân người dùng. Chỉ cần đoán ngẫu nhiên. Có được một dấu vết. –

2
  1. Bạn nên loại bỏ Content-Type tiêu đề vô dụng ở đây.
  2. Kiểm tra xem bạn có đang sử dụng IIS hay không và nếu tệp/thư mục mà bạn đang cố xóa có quyền xóa không. Đây là những người dùng mà tôi có thể nghĩ đến: Tài khoản IUSR hoặc IUSR_MachineName. Nhóm IIS_IUSRS hoặc IIS_WPG.
  3. Để trả về lỗi 501 - PUT, DELETE, OPTIONS không được bật theo mặc định. Do đó, bạn cần phải kích hoạt ở cấp độ máy chủ web.

Bạn nên đảm bảo rằng các cấu hình sau có trong tệp cấu hình. Bạn cũng có thể thấy một số bài đăng khác có liên quan đến xóa. (sửa đổi các cài đặt bên dưới để đưa vào môi trường của bạn).

<handlers> 
     <remove name="WebDAV" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
0

Mã sau đây có tác dụng đối với tôi, nó cũng có thể có ích cho bạn.

string headername = "TokenName"; 
string headervalue = "0000000000"; 

var request = (HttpWebRequest)WebRequest.Create("https://URL"); 

request.Method = "DELETE"; 
request.Headers.Add(headername, headervalue); 

try 
{ 
    var response = (HttpWebResponse)request.GetResponse(); 

    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

    var jss = new JavaScriptSerializer(); 
    var dict = jss.Deserialize<dynamic>(responseString); 
    string message += "deleted Item with id" + dict["id"]; 
} 
catch 
{ 
    string message += "Didn't delete Item"; 
}