0

外部ファイルで以下の 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"
%>
4

1 に答える 1

0

JavaScriptを含むページが(ポート番号を含めて)提供されていない場合、問題は、同一生成元ポリシーhttp://localhost:49456によってブロックされているクロスオリジン呼び出しを行おうとしていることです。したがって、たとえば、ファイルエクスプローラーでJavaScriptをダブルクリックして開いたファイルでそのJavaScriptを使用している場合(およびそのプロトコルは)、または(ポート49456を使用せずに)そこからJavaScriptをロードしている場合などです。。file://http://localhost

飛行前の呼び出しを処理し、適切なヘッダーで応答することにより、クロスオリジンリソースシェアリングを使用してアクセスを有効にすることができます( CORSをサポートするブラウザーを使用している場合)。

于 2013-03-12T10:54:21.827 に答える