我有 2 个站点。
我也有一个网络服务。
当我在级联下拉列表中加载国家/地区名称时,您可以看到这一点:http ://www.mydomain.com/trouwlocaties/zoeken-uitgebreid
但是,相同的 Web 服务在以下位置引发错误: http: //otherdomain.com/weddingvenues/search-advanced 正如您所看到的下拉菜单显示“方法错误 -1”,在我的 Chrome 控制台中我看到:500(内部服务器错误) ,客户端尝试获取 .asmx 服务,在 toptrouwen 上它使用 POST(这是我相信应该发生的事情并且也更安全)。
这是 GetCountries 网络服务:
<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<ToolboxItem(False)> _
Public Class geolocation
'<System.Web.Script.Services.ScriptService()> _
'<WebService(Namespace:="http://tempuri.org/")> _
'<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
'<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function GetCountries(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
Dim values As New List(Of CascadingDropDownNameValue)
Dim myConnection As SqlConnection = GetConnection()
Dim cmd As New SqlCommand(String.Format("SELECT id,name as title FROM country order by title asc", Threading.Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName), myConnection)
Try
myConnection.Open()
Dim reader As SqlDataReader = cmd.ExecuteReader
Dim CountryName As String
Dim CountryID As Integer
While reader.Read
CountryName = reader("title").ToString
Int32.TryParse(reader("id"), CountryID)
values.Add(New CascadingDropDownNameValue(CountryName, CountryID.ToString))
End While
Catch ex As Exception
Finally
myConnection.Close()
End Try
Return values.ToArray
End Function
End Class
首先,我尝试将其添加到我的 web.config 中:
<system.web>
<webServices>
<protocols>
<remove name="Documentation"/>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
之后,我在我的 Chrome 控制台中收到了这个:
Uncaught SyntaxError: Unexpected token <
显然结果没有被解释为 XML,但我的猜测是 JSON。经过一些 Google 搜索后,我认为这与 MIME 类型有关,但我从未发现如何将其更改为 XML 以用于该服务。
所以我继续搜索,发现了别的东西,我正在阅读这些帖子: http : //social.msdn.microsoft.com/forums/en-us/asmxandxml/thread/F80BDA62-C87A-4BDA-8CB1-F2CFAD1C8891 Uncaught SyntaxError: Unexpected令牌 < -- 在 jQuery ajax 中
显然这可能是一个“跨域问题”。
所以我最终创建了这些文件:
客户端访问策略.xml
<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
跨域.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
<allow-access-from domain="*.otherdomain.com" secure="false" />
</cross-domain-policy>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="GetCountries" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://www.mydomain.com/geolocation.asmx"
binding="basicHttpBinding" name="GeoLocation" />
</client>
</system.serviceModel>
</configuration>
在第一个示例链接中,用户还添加了属性 bindingConfiguration="DashboardServiceSoap" 和 contract="DashboardService.DashboardServiceSoap",但我不知道我必须为我的案例填写什么。
我仍然卡住了,我不知道什么是正确的轨道以及如何配置我的设置。
更新 21-06-2013
将我的 web.config 更新为:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
我还尝试了以下 4 种配置:
<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
<ToolboxItem(False)> _
Public Class geolocation
Inherits System.Web.Services.WebService
场景 1 和 2 使用此方法定义:
<WebMethod()> _
Public Function GetCountries(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
场景 1:web.config 中的 WITH 协议部分
<webServices>
<protocols>
<remove name="Documentation"/>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
在 .nl 域上工作正确 在 .com 域上引发方法错误 -1。Chrome 控制台显示:Uncaught SyntaxError: Unexpected token < GetCountries:1
场景 2:web.config 中没有协议部分
在 .nl 域上工作正确 在 .com 域上引发方法错误 -1。Chrome 控制台显示:GET http://www.otherdomain.com/geolocation.asmx/GetCountries?knownCategoryValues=%22%22&category=%22Country%22&callback=Sys._jsonp0 500 (Internal Server Error) ScriptResource.axd:7773
使用此方法定义的场景 3 和 4:
<WebMethod()> _
<ScriptMethod(UseHttpGet:=True, ResponseFormat:=System.ServiceModel.Web.WebMessageFormat.Json)> _
Public Function GetCountries(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
场景 3:web.config 中的 WITH 协议部分
<webServices>
<protocols>
<remove name="Documentation"/>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
在 .nl 域上引发方法错误 500。Chrome 控制台显示:POST http://www.mydomain.com/geolocation.asmx/GetCountries 500(内部服务器错误) catcher.js:197 在下拉列表中的 .com 域上引发方法错误 -1。Chrome 控制台显示:Uncaught SyntaxError: Unexpected token < GetCountries:1
场景 4:web.config 中没有协议部分
在 .nl 域上引发方法错误 500。Chrome 控制台显示:加载资源失败:服务器响应状态为 500(内部服务器错误)在下拉列表中的 .com 域上引发方法错误 -1。Chrome 控制台显示:GET http://www.otherdomain.com/geolocation.asmx/GetCountries?knownCategoryValues=%22%22&category=%22Country%22&callback=Sys._jsonp0 500(内部服务器错误)
此外,我没有明确地从脚本中调用 .asmx,我让级联下拉菜单为我工作。像这样:
<asp:DropDownList ID="ddlCountries" CssClass="textbox" AutoPostBack="true" runat="server"></asp:DropDownList>
<cc1:cascadingdropdown ID="cddCountries" runat="server" Category="Country" Enabled="True" LoadingText="<%$Resources:Glossary,loading %>" PromptText="<%$Resources:Glossary,country_choose %>"
ServiceMethod="GetCountries" TargetControlID="ddlCountries">
</cc1:cascadingdropdown>
代码隐藏
cddCountries.ServicePath = "http://www.mydomain.com/geolocation.asmx"
我不知道我使用这些预定义元素的事实是否与我的问题有关,我最好自己通过脚本调用 .asmx 服务并填写下拉列表。如果是这样:我不知道该怎么做。