ASP.net中的跨域服务(.asmx) [英] Cross domain Service in ASP.net (.asmx)

查看:118
本文介绍了ASP.net中的跨域服务(.asmx)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Dear,

I have create a webservices. I checked it, its getting data from database as JSON format.I'm Using Visual Studio 2010 Professional. I'm using DevExtrem for mobile when i tried that services i got error then they said you need to create a web services as CORS( Cross domain Services)

Here is the WebService1.asmx file code.

    <WebMethod(), ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=True)> _
    Public Function GetUserDetails() As String
        Dim dt As New DataTable()
        Using con
            Using cmd As New OleDb.OleDbCommand("SELECT * FROM Mst_User", con)
                con.Open()
                Dim da As New OleDb.OleDbDataAdapter(cmd)
                da.Fill(dt)
                Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer()
                Dim rows As New List(Of Dictionary(Of String, Object))()
                Dim row As Dictionary(Of String, Object)
                For Each dr As DataRow In dt.Rows
                    row = New Dictionary(Of String, Object)()
                    For Each col As DataColumn In dt.Columns
                        row.Add(col.ColumnName, dr(col))
                    Next
                    rows.Add(row)
                Next
                Return serializer.Serialize(rows)
            End Using
        End Using
    End Function

I did in Global.asax file and also in Web.config file.

Here is the Global.asax file.

Imports System.Web.SessionState

Public Class Global_asax
    Inherits System.Web.HttpApplication

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the application is started
    End Sub

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the session is started
    End Sub

    Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires at the beginning of each request
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache)
        HttpContext.Current.Response.Cache.SetNoStore()
        Call EnableCrossDmainAjaxCall()
    End Sub

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires upon attempting to authenticate the use
    End Sub

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when an error occurs
    End Sub

    Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the session ends
    End Sub

    Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when the application ends
    End Sub
    Private Sub EnableCrossDmainAjaxCall()
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*")
        If HttpContext.Current.Request.HttpMethod = "OPTIONS" Then
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST")
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept")
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000")
            HttpContext.Current.Response.[End]()
        End If
    End Sub
End Class

and here is web.config file.

<?xml version="1.0"?>
<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
      </protocols>
    </webServices>
    <compilation debug="true"/>
  </system.web>
  <appSettings>
    <add key="Contsr" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Test.mdb;User Id=admin;Password=;" />
    <add key="CrystalImageCleaner-AutoStart" value="true" />
    <add key="CrystalImageCleaner-Sleep" value="60000" />
    <add key="CrystalImageCleaner-Age" value="120000" />
  </appSettings>
  <connectionStrings>
    <add name="Contr" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Test.mdb" providerName="System.Data.OleDb" />
  </connectionStrings>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*"/>
        <add name="Access-Control-Allow-Headers" value="Content-Type"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

Its working perfectly and showing result. but when i access in mobile platform

i got error. Below is the error.

XMLHttpRequest cannot load http://localhost/Iservice/WebService1.asmx/GetUserDetails. The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Origin 'http://localhost:52083' is therefore not allowed access.


Here is my mobile code. I uploaded web services in my Local IIS. and i'm checking mobile services in my local machine. Note that Same thing i uploaded in web but getting same error.

Application17.home = function (params) {
    var myDataSource = new DevExpress.data.DataSource({
        load: function (loadOptions) {
            return $.ajax({
                crossDomain: true,
                url: "http://localhost/Iservice/WebService1.asmx/GetUserDetails",
                type: "POST",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(params)
            });
        }
    });
    var viewModel = {
        mysource: myDataSource
    };

    return viewModel;

};

Please help on this.

Thanks
Basit.

推荐答案

.ajax({
crossDomain:true ,
url:http://localhost/Iservice/WebService1.asmx/GetUserDetails,
类型:POST,
contentType:application / json; charset = utf-8 ,
dataType:json,
data:JSON.stringify(params)
});
}
});
var viewModel = {
mysource:myDataSource
};

返回viewModel;

};

请帮忙。

谢谢
Basit。
.ajax({ crossDomain: true, url: "http://localhost/Iservice/WebService1.asmx/GetUserDetails", type: "POST", contentType: "application/json; charset=utf-8", dataType: "json", data: JSON.stringify(params) }); } }); var viewModel = { mysource: myDataSource }; return viewModel; }; Please help on this. Thanks Basit.


我找到你了!!!

你添加Access -Control-Allow-Origin两次在您的服务器中(更不用说客户端了)...

一旦形成代码:

I got you!!!
You add Access-Control-Allow-Origin twice in your server (not to mention the client too)...
Once form the code:
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*")



第二次形成配置文件:


And a second time form the config file:

<add name="Access-Control-Allow-Origin" value="*" />



只执行一次!!!


Do it only once!!!


这篇关于ASP.net中的跨域服务(.asmx)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆