每当我尝试在外部文件中使用下面的javascript使用WCF时,readyState从1变为4.在每种情况下,ResponsText始终为空。
每当我尝试使用相同的代码来使用WCF时,但这次是在项目本身,它正在按预期工作。
我做错了什么?提前谢谢。
我有一个界面
namespace CeviService
{
[ServiceContract(Namespace = "CeviService")]
public interface ICeviSpotter
{
[WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
String EchoWithPost(string n1, string n2);
}
}
带有实现
namespace CeviService
{
public class CeviSpotter : ICeviSpotter
{
public String EchoWithPost(String n1, String n2)
{
return n1;
}
}}
使用以下web.config
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="AjaxBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service name="CeviService.CeviSpotter" behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
<endpoint address="ajaxEndpoint" behaviorConfiguration="AjaxBehavior" binding="webHttpBinding" contract="CeviService.ICeviSpotter"/>
</service>
</services>
</system.serviceModel>
<system.web>
<compilation debug="true"/></system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
使用以下javascript调用:
function makeCall(operation) {
// Create HTTP request
var xmlHttp;
try {
xmlHttp = new XMLHttpRequest();
} catch (e) {
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("This sample only works in browsers with AJAX support");
return false;
}
}
}
// Create result handler
xmlHttp.onreadystatechange = function () {
alert(xmlHttp.readyState);
// alert(xmlHttp.responseText);
}
// Build the operation URL
var url = "http://localhost:49456/CeviSpotter.svc/ajaxendpoint/EchoWithPost";
//url = url + operation;
// Build the body of the JSON message
var val1 = document.getElementById("num1").value;
var val2 = document.getElementById("num2").value;
var body = '{"n1":';
body = body + val1 + ',"n2":';
body = body + val2 + '}';
// Send the HTTP request
xmlHttp.open("POST", url, true);
xmlHttp.setRequestHeader("Content-type", "application/json");
xmlHttp.send(body);
}
并且主机配置如下:
<%@ServiceHost
language="C#"
Debug="true"
Service="CeviService.CeviSpotter"
%>
答案 0 :(得分:0)
如果没有从http://localhost:49456
(包括端口号)提供包含JavaScript的页面,则问题是您正在尝试进行跨域调用,该调用被{{阻止3}}。因此,例如,如果您在文件中使用该JavaScript,则可以通过在文件资源管理器中双击它来打开它(因此其协议为file://
),或者您从{{1 (不使用端口49456)等等。
您可以通过处理转机前呼叫并使用相应的标头进行回复,使用Same Origin Policy启用访问权限(假设您使用的是Cross-Origin Resource Sharing)。