2011-02-03 27 views
6

EDIT: Tóm tắt: Có vẻ như ứng dụng web của tôi có thể được truy cập bởi bất kỳ ai (chỉ có firefox hoặc chrome) và bởi tôi sử dụng máy tính chính của tôi. Nếu tôi cố gắng truy cập http://luiscarlosch.com/WebFormClean.aspx từ bất kỳ mạng LAN nào khác của tôi, bạn sẽ gặp phải lỗi 405405: Phương pháp không được phép

Tôi hoàn toàn có thể gọi phương thức web WCF từ máy chủ cục bộ. Tôi đã xuất bản lên máy chủ này: http://luiscarlosch.com/WebFormClean.aspx (chỉ có firefox hoặc chrome) với công cụ xuất bản Visual Studio và nó hoạt động tốt. Vấn đề là khi thử truy cập nó từ một máy tính khác. Tôi nhận được 405: Phương pháp không được phép. Nhưng It doest làm cho tinh thần bởi vì nó hoạt động tốt khi tôi truy cập nó từ xa từ máy tính nhà xuất bản như tôi đã nói. Bất kỳ ý tưởng nào?

[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class ContactProxy 
{ 
    [WebGet()] 
    [OperationContract] 
    public Contact getByID(int IDContact) 
    { 
     Contact contact = new Contact(IDContact); 
     return contact; 
    } 
    [OperationContract] 
    public EntityData insertEntityData(int IDEntityDataFieldType, int IDContact, String value) 
    { 
     //Contact contact = new Contact(); 
     // contact.insertEntityData(IDEntityDataFieldType, IDContact, value); 
     EntityData entityData = new EntityData(); 
     entityData.save(IDEntityDataFieldType, IDContact, value); 

     return entityData; 
    } 
} 

Cả hai phương pháp đều không hoạt động.

Tôi vừa nhận thấy một số người dùng có thể truy cập http://luiscarlosch.com/WebFormClean.aspx vì họ thay đổi giá trị. Vì thế. một số khách hàng có thể đọc các phương pháp nhưng một số không thể. Điều này sẽ xảy ra.

Web Config

<?xml version="1.0"?> 

<configuration> 
    <configSections> 
    </configSections> 
    <connectionStrings> 
    <add name="ApplicationServices" 
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <customErrors mode="Off"/> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> 
    </authentication> 
    <membership> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" 
      enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" 
      maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" 
      applicationName="/" /> 
     </providers> 
    </membership> 
    <profile> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> 
     </providers> 
    </profile> 
    <roleManager enabled="false"> 
     <providers> 
     <clear/> 
     <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
     <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
     </providers> 
    </roleManager> 
    </system.web> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceTypeBehaviors" > 
      <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="WebApplicationTest.WCFProxy.EmployeeProxyAspNetAjaxBehavior"> 
      <enableWebScript /> 
     </behavior> 
     <behavior name="WebApplicationTest.WCFProxy.EntityDataFieldCollectionProxyAspNetAjaxBehavior"> 
      <enableWebScript /> 
     </behavior> 
     <behavior name="WebApplicationTest.WCFProxy.Service1AspNetAjaxBehavior"> 
      <enableWebScript /> 
     </behavior> 
     <behavior name="WebApplicationTest.WCFProxy.ContactProxyAspNetAjaxBehavior"> 
      <enableWebScript /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="WebApplicationTest.WCFProxy.EmployeeProxy" behaviorConfiguration="MyServiceTypeBehaviors" > 
     <endpoint address="" behaviorConfiguration="WebApplicationTest.WCFProxy.EmployeeProxyAspNetAjaxBehavior" 
      binding="webHttpBinding" contract="WebApplicationTest.WCFProxy.EmployeeProxy" /> 
     <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
     </service> 
     <service name="WebApplicationTest.WCFProxy.EntityDataFieldCollectionProxy" behaviorConfiguration="MyServiceTypeBehaviors" > 
     <endpoint address="" behaviorConfiguration="WebApplicationTest.WCFProxy.EntityDataFieldCollectionProxyAspNetAjaxBehavior" 
      binding="webHttpBinding" contract="WebApplicationTest.WCFProxy.EntityDataFieldCollectionProxy" /> 
     <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
     </service> 
     <service name="WebApplicationTest.WCFProxy.Service1"> 
     <endpoint address="" behaviorConfiguration="WebApplicationTest.WCFProxy.Service1AspNetAjaxBehavior" 
      binding="webHttpBinding" contract="WebApplicationTest.WCFProxy.Service1" /> 
     </service> 
     <service name="WebApplicationTest.WCFProxy.ContactProxy" behaviorConfiguration="MyServiceTypeBehaviors" ><!--new--> 
     <endpoint address="" behaviorConfiguration="WebApplicationTest.WCFProxy.ContactProxyAspNetAjaxBehavior" 
      binding="webHttpBinding" contract="WebApplicationTest.WCFProxy.ContactProxy" /> 
     <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
     </service> 
    </services> 
    <bindings /> 
    <client /> 
    </system.serviceModel> 
</configuration> 
+0

Có phải dịch vụ REST không? Chúng tôi cần thêm thông tin (hợp đồng, cấu hình, v.v.) ... –

+0

Thankx. Tôi chỉ đăng một số thông tin thêm. –

+0

Dường như IIS là khối POST (hoặc các yêu cầu khác). – leppie

Trả lời

1

Để cho phép ajax miền chéo gọi bạn cần

1) đầu tiên để cấu hình máy chủ web của bạn để cho phép nguồn gốc và Headers 2) cho phép các phương pháp sử dụng để làm yêu cầu

Có vẻ như bạn đã hoàn thành điểm đầu tiên và có thể là lần thứ hai bạn chỉ cần thay đổi:

[WebGet()] 

tới:

[WebInvoke(Method = "*")] 
  • vì mặc dù bạn thực hiện một POST hoặc GET yêu cầu.Chrome và Firefox luôn gửi OPTIONS
+0

Điều này thực sự hiệu quả với tôi. IE11 cũng gửi OPTIONS cho các yêu cầu của CORS Preflight – ohmusama

0

Something lẻ đang xảy ra trong dịch vụ của bạn. Trước tiên, tôi nghĩ rằng không thể gọi được insertEntityDate vì thiếu thuộc tính WebGet hoặc WebInvoke. Một điều lạ là getById được định nghĩa là WebGet nhưng nó được gọi là yêu cầu POST JSON - Tôi chỉ kiểm tra nó với Firebug và Fiddler:

POST http://luiscarlosch.com/WCFProxy/ContactProxy.svc/getByID HTTP/1.1 
Host: luiscarlosch.com 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.1.16) Gecko/20101130 Firefox/3.5.16 (.NET CLR 3.5.30729; .NET4.0E) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-gb,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Proxy-Connection: keep-alive 
X-Requested-With: XMLHttpRequest 
Content-Type: application/json; charset=utf-8 
Referer: http://luiscarlosch.com/WebFormClean.aspx 
Content-Length: 15 
Cookie: ASP.NET_SessionId=puzd3ulsj4em4ufd21b4lkjr 
Pragma: no-cache 
Cache-Control: no-cache 

{"IDContact":1} 

Dịch vụ này làm việc cho tôi nhưng nó không phải là dịch vụ tương tự được mô tả theo hợp đồng bạn đã cho chúng tôi thấy. Btw. không có lý do nào để kích hoạt hành vi serviceMetadata và thêm các điểm cuối Mex nếu bạn cũng không sử dụng điểm cuối SOAP.

0

Khi sử dụng CORS, đặc tả yêu cầu các trình duyệt "preflight" yêu cầu, mời các phương thức được hỗ trợ từ máy chủ với HTTP OPTIONS và máy chủ gửi phương thức 405 không được phép, cũng cho biết phương thức được phép.

Mục đích duy nhất của phản hồi này là giúp bạn tìm ra các tùy chọn liên lạc có sẵn cho một tài nguyên URL cụ thể. Cho phép khách hàng xác định các tùy chọn và/hoặc các yêu cầu liên quan đến tài nguyên hoặc khả năng của máy chủ mà không có hành động cụ thể liên quan đến việc chuyển dữ liệu.

Hy vọng nó giúp,

0
<system.webServer> 
<handlers> 
<remove name="WebDAV" /> 
     <add name="RestProxy32" path="Service.svc" verb="*" modules="IsapiModule" 
      scriptProcessor="C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" 
      preCondition="classicMode,runtimeVersionv2.0,bitness32"/> 
     <add name="RestProxy64" path="Service.svc" verb="*" modules="IsapiModule" 
      scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" 
      preCondition="classicMode,runtimeVersionv2.0,bitness64"/> 
</handlers> 
<modules> 
<remove name="WebDAVModule" /> 
</modules> 

</system.webServer> 
Các vấn đề liên quan