6

EDIT: Summary: It seems that my web app can be accessed by anyone (only firefox or chrome) and by me using my main computer. If i try to access http://luiscarlosch.com/WebFormClean.aspx from any other of my LAN it gets a 405 error

I can perfectly call a WCF web method from localhost. I published to this server: http://luiscarlosch.com/WebFormClean.aspx (only firefox or chrome) with the Visual Studio publishing tool and it works fine. The problem is when a try to access it from another computer. I get the 405: Method Not Allowed. But It doest make sense because It works fine when i access it remotely from the publisher computer as I said. Any idea?

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

Neither method seems to work.

I just noticed some user were able to access http://luiscarlosch.com/WebFormClean.aspx because they change the values. So. some clients can read the methods but some cant. This should be happening.

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>
Luis Carlos Chavarría
  • 3,551
  • 2
  • 23
  • 26

4 Answers4

1

In order to allow cross domain ajax call you need

1) first to configure your web server to allow origins and Headers 2) allow methods used to make the request

It's seems that you have accomplished the first point and maybe for the second you just need to change:

[WebGet()]

to:

[WebInvoke(Method = "*")]
  • because although you perform a POST or GET request. Chrome and Firefox always send OPTIONS
Francesco Milani
  • 375
  • 3
  • 11
0

When using CORS the specification mandates that browsers "preflight" the request, soliciting supported methods from the server with an HTTP OPTIONS and the server sends a 405 method not allowed response, also indicating the allowed method.

The sole purpose of this response is to help you find out the communication options available for a particular URL resource. Allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without a specific action involving transfer of data.

Hope it helps,

kohku
  • 116
  • 1
  • 6
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>
Arun Raj
  • 929
  • 8
  • 17
0

Something odd is happening in your service. First I think that insertEntityDate should not be callable because it is missing WebGet or WebInvoke attribute. Another strange thing is that getById is defined as WebGet but it is called as POST JSON request - I just checked it with FireBug and 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}

The service works for me but it is not the same service described by contract you have shown us. Btw. there is no reason to enable serviceMetadata behavior and add Mex endpoints if you are not going to use SOAP endpoint as well.

Ladislav Mrnka
  • 349,807
  • 56
  • 643
  • 654