2013-05-24 69 views
20

Tôi đã viết một ứng dụng hoạt động tốt trong nhiều tháng, trong vài ngày qua tôi đã nhận được lỗi bên dưới chỉ trên phiên bản đã cài đặt.Máy chủ từ xa trả lại lỗi: (403) Bị cấm

Nếu tôi chạy mã nguồn trong VS, mọi thứ hoạt động tốt. Ngoài ra, .exe trong các thư mục bin hoạt động tốt. Nó chỉ là phiên bản cài đặt mà tạo ra các lỗi, nếu tôi biên dịch lại và cài đặt lại tôi nhận được cùng một lỗi.

Tôi hơi bối rối về những gì gây ra điều này và hy vọng một vài gợi ý. Nó có vẻ là một phản ứng WebRequest thông qua IE không được trả lại nhưng tôi stumped là tại sao nó hoạt động tốt trong VS mà không có bất kỳ lỗi nào. Có bất kỳ biện pháp/chính sách bảo mật mới nào của IE có thể gây ra điều này không?

Những điều tôi đã cố gắng cho đến nay bao gồm:

  • Disabled tất cả AntiVirus & Firewall
  • Run as Administrator

Các Ngoại lệ:

Exception: System.Windows.Markup.XamlParseException: The invocation of the constructor on type 'XApp.MainWindow' that matches the specified binding constraints threw an exception. ---> System.Net.WebException: The remote server returned an error: (403) Forbidden. 
    at System.Net.HttpWebRequest.GetResponse() 
    at XApp.HtmlRequest.getHtml(Uri uri) in J:\Path\MainWindow.xaml.cs:line 3759 
    at XApp.MainWindow.GetLinks() in J:\Path\MainWindow.xaml.cs:line 2454 
    at XApp.MainWindow..ctor() in J:\Path\MainWindow.xaml.cs:line 124 
    --- End of inner exception stack trace --- 
    at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) 
    at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri) 
    at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream) 
    at System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc) 
    at System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties) 
    at System.Windows.Application.DoStartup() 
    at System.Windows.Application.<.ctor>b__1(Object unused) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
Exception: System.Net.WebException: The remote server returned an error: (403) Forbidden. 
    at System.Net.HttpWebRequest.GetResponse() 
    at XApp.HtmlRequest.getHtml(Uri uri) in J:\Path\MainWindow.xaml.cs:line 3759 
    at XApp.MainWindow.GetLinks() in J:\Path\MainWindow.xaml.cs:line 2454 
    at XApp.MainWindow..ctor() in J:\Path\MainWindow.xaml.cs:line 124 

EDIT:

Cài đặt này được cài đặt dưới dạng ứng dụng độc lập. Khi tôi chạy với tư cách Quản trị viên, tôi đã mở thư mục chương trình và chạy exe với tư cách quản trị viên thay vì phím tắt.

Mã gây ra vấn đề là này

private void GetLinks() 
{ 
    //Navigate to front page to Set cookies 
    HtmlRequest htmlReq = new HtmlRequest(); 

    OLinks = new Dictionary<string, List<string>>(); 

    string Url = "http://www.somesite.com/somepage"; 
    CookieContainer cookieJar = new CookieContainer(); 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); 
    request.CookieContainer = cookieJar; 

    request.Accept = @"text/html, application/xhtml+xml, */*"; 
    request.Referer = @"http://www.somesite.com/"; 
    request.Headers.Add("Accept-Language", "en-GB"); 
    request.UserAgent = @"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)"; 
    request.Host = @"www.somesite.com"; 

    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    String htmlString; 
    using (var reader = new StreamReader(response.GetResponseStream())) 
    { 
     htmlString = reader.ReadToEnd(); 
    } 

    //More Code 


} 
+1

Trước hết mã của bạn là gì? Sau đó, nếu tôi là bạn, tôi sẽ cố gắng theo dõi các tin nhắn HTTP bằng cách sử dụng Fiddler, và so sánh các yêu cầu làm việc và không hoạt động. –

+1

Làm thế nào để bạn chạy "phiên bản đã cài đặt" của mình - với tư cách là một Dịch vụ hoặc nó là một ứng dụng bàn điều khiển/máy tính để bàn thông thường? Bạn nên cố gắng xác minh theo ngữ cảnh của người dùng mà ứng dụng đang chạy. Bạn có thể xây dựng chính xác những gì bạn đã làm để chạy ứng dụng của mình với tư cách là Quản trị viên không? Vui lòng cung cấp thêm một chút chi tiết về kiến ​​trúc ứng dụng của bạn - những kết nối nào được thiết lập. Đây có phải là máy chủ hoặc ứng dụng khách không? – Marcus

Trả lời

14

Thêm dòng sau:

request.UseDefaultCredentials = true; 

này sẽ cho phép các ứng dụng sử dụng các thông tin của người dùng đăng nhập để truy cập vào trang web. Nếu nó quay trở lại 403, rõ ràng nó mong đợi xác thực.

Cũng có thể bạn (bây giờ?) Có một proxy xác thực giữa bạn và trang web từ xa. Trong trường hợp đó, hãy thử:

request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 

Hy vọng điều này sẽ hữu ích.

+0

Xin lỗi vì sự chậm trễ, tôi vừa thử nghiệm. Đề xuất đầu tiên của bạn đã giải quyết được vấn đề. Cảm ơn nhiều! – user3357963

+0

Không hoạt động ... –

2

nó một lỗi cho phép. VS của bạn có thể chạy bằng tài khoản nâng cao hoặc tài khoản người dùng khác với người dùng sử dụng phiên bản đã cài đặt.

Có thể hữu ích khi kiểm tra quyền truy cập IIS của bạn và xem những tài khoản nào có quyền truy cập vào tài nguyên bạn đang truy cập. Tham chiếu chéo với tài khoản bạn sử dụng và tài khoản mà các phiên bản đã cài đặt đang sử dụng.

+0

Họ nói rằng họ đã thử chạy với tư cách Quản trị viên. –

+0

Tài khoản quản trị viên có quyền trên máy chủ web nhận được yêu cầu không? Lưu ý MyLocalPC \ Administrator và máy chủ \ Administrator không giống tài khoản – James

13

Dường như vấn đề được dựa trên phía máy chủ.

Im trường hợp của tôi, tôi đã làm việc với máy chủ paypal và không ai trong số những câu trả lời gợi ý giúp, nhưng http://forums.iis.net/t/1217360.aspx?HTTP+403+Forbidden+error

I was facing this issue and just got the reply from Paypal technical. Add this will fix the 403 issue. HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.UserAgent = "[any words that is more than 5 characters]";

+0

Đây là giải pháp cho vấn đề "Cấm" mà tôi gặp phải khi cố gắng sử dụng API GitHub. Phải mất vài giờ tìm kiếm trước khi tôi tình cờ gặp bài đăng này. –

+1

.UserAgent là nó cho tôi trên một máy chủ sản xuất. Tôi đoán tôi phải có IIS thiết lập để cấm các yêu cầu mà không có một tác nhân được chỉ định. – secretwep

+0

ditto Spotify nguồn cấp dữ liệu ATOM – planetClaire

0
private class GoogleShortenedURLResponse 
    { 
     public string id { get; set; } 
     public string kind { get; set; } 
     public string longUrl { get; set; } 
    } 

    private class GoogleShortenedURLRequest 
    { 
     public string longUrl { get; set; } 
    } 

    public ActionResult Index1() 
    { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult ShortenURL(string longurl) 
    { 
     string googReturnedJson = string.Empty; 
     JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer(); 

     GoogleShortenedURLRequest googSentJson = new GoogleShortenedURLRequest(); 
     googSentJson.longUrl = longurl; 
     string jsonData = javascriptSerializer.Serialize(googSentJson); 

     byte[] bytebuffer = Encoding.UTF8.GetBytes(jsonData); 

     WebRequest webreq = WebRequest.Create("https://www.googleapis.com/urlshortener/v1/url"); 
     webreq.Method = WebRequestMethods.Http.Post; 
     webreq.ContentLength = bytebuffer.Length; 
     webreq.ContentType = "application/json"; 

     using (Stream stream = webreq.GetRequestStream()) 
     { 
      stream.Write(bytebuffer, 0, bytebuffer.Length); 
      stream.Close(); 
     } 

     using (HttpWebResponse webresp = (HttpWebResponse)webreq.GetResponse()) 
     { 
      using (Stream dataStream = webresp.GetResponseStream()) 
      { 
       using (StreamReader reader = new StreamReader(dataStream)) 
       { 
        googReturnedJson = reader.ReadToEnd(); 
       } 
      } 
     } 

     //GoogleShortenedURLResponse googUrl = javascriptSerializer.Deserialize<googleshortenedurlresponse>(googReturnedJson); 

     //ViewBag.ShortenedUrl = googUrl.id; 
     return View(); 
    } 
+3

không đặt câu trả lời mà không có giải thích. Vui lòng giải thích những gì bạn đang đề xuất. Đây là một khối mã lớn có thể trả lời câu hỏi, nhưng phải được ghép nối với một số chi tiết. –

0

Điều này có lẽ sẽ không giúp quá nhiều người, nhưng đây là trường hợp của tôi: Tôi đã sử dụng Jira Rest Api và đang sử dụng thông tin cá nhân của tôi (những người tôi sử dụng để đăng nhập vào Jira). Tôi đã cập nhật mật khẩu Jira của mình nhưng quên cập nhật chúng trong mã của tôi.Tôi đã nhận được lỗi 403, tôi đã thử cập nhật mật khẩu của mình trong mã nhưng vẫn gặp lỗi.

Giải pháp: Tôi đã thử đăng nhập vào Jira (từ trang đăng nhập của họ) và tôi phải nhập văn bản để chứng minh tôi không phải là bot. Sau đó tôi thử lại từ mã và nó hoạt động. Takeaway: Máy chủ có thể đã khóa bạn.

0

Trong trường hợp của tôi, tôi nhớ rằng một lỗ hổng trong tường lửa đã được tạo cho địa chỉ này một thời gian trước đây, vì vậy tôi phải đặt useDefaultWebProxy = "false" trên liên kết trong tệp cấu hình, như thể mặc định là sử dụng proxy nếu useDefaultWebProxy không được chỉ định.

0

Setting:

request.Referer = @"http://www.somesite.com/"; 

và thêm cookies hơn làm việc cho tôi

0

Chúng ta nên truy cập vào trang web bằng cách sử dụng tên được đưa ra trong các chứng chỉ. enter image description here

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