2011-02-03 3 views
6

EDIT: Summary: Кажется, что у моего веб-приложения может быть доступен любой (только firefox или chrome), и я использую мой главный компьютер. Если я пытаюсь получить доступ к http://luiscarlosch.com/WebFormClean.aspx из любой другой моей локальной сети, он получает ошибку 405405: Метод не разрешен

Я могу полностью назвать веб-метод WCF с localhost. Я опубликовал на этом сервере: http://luiscarlosch.com/WebFormClean.aspx (только firefox или chrome) с инструментом публикации Visual Studio, и он отлично работает. Проблема заключается в попытке получить доступ к нему с другого компьютера. Я получаю 405: метод не разрешен. Но это действительно имеет смысл, потому что он отлично работает, когда я получаю доступ к нему удаленно от компьютера издателя, как я уже сказал. Любая идея?

[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; 
    } 
} 

Ни один способ не работает.

Я только заметил, что некоторые пользователи смогли получить доступ к http://luiscarlosch.com/WebFormClean.aspx, потому что они меняют значения. Так. некоторые клиенты могут читать методы, но некоторые не могут. Это должно происходить.

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

Является ли это услугой REST? Нам нужна дополнительная информация (контракт, конфиг и т. Д.) ... –

+0

Thankx. Я просто разместил дополнительную информацию. –

+0

Кажется, что IIS является блоком POST (или других) запросов. – leppie

ответ

1

Для того, чтобы позволить Междоменный Аяксу называть вам нужно

1) сначала настроить веб-сервер, чтобы происхождение и заголовки 2) позволяют методы используются для запрос

Это кажется, что вы достигли первой точки и, возможно, для второй вам просто нужно изменить:

[WebGet()] 

к:

[WebInvoke(Method = "*")] 
  • потому что, хотя вы выполнить POST или GET запрос.Chrome и Firefox всегда отправляют ОПЦИИ
+0

Это действительно сработало для меня. IE11 также отправляет ВАРИАНТЫ для запросов CORE Preflight – ohmusama

0

-то странное происходит в вашей службе. Сначала я думаю, что insertEntityDate не должен быть вызван, потому что ему не хватает атрибута WebGet или WebInvoke. Еще одна странная вещь, что getById определяется как WebGet но называется как запрос POST JSON - я только что проверил его с FireBug и Скрипач:

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} 

Сервис работает для меня, но это не та же услуга описывается договором вы показали нам. Btw. нет причин для включения поведения serviceMetadata и добавления конечных точек Mex, если вы также не собираетесь использовать конечную точку SOAP.

0

При использовании CORS спецификация требует, чтобы браузеры «предваряли» запрос, запрашивая поддерживаемые методы с сервера с помощью HTTP OPTIONS, и сервер отправляет 405-метод недопустимый ответ, а также указывает разрешенный метод.

Единственная цель этого ответа - помочь вам узнать параметры связи, доступные для определенного ресурса URL. Позволяет клиенту определять параметры и/или требования, связанные с ресурсом, или возможности сервера, без особых действий, связанных с передачей данных.

Надеется, что это помогает,

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> 
Смежные вопросы