1

次のWebサービスを作成し、最新バージョンのjqueryを使用してWebサービスに投稿する必要があります。

私はこれを理解することはできません。JSONPはPOSTでは機能しないことを読みました。これを機能させるにはどうすればよいですか?

jQueryを使用してWCFにクロスドメイン投稿を行う必要があります。

service.cs:

namespace AjaxPost
{
    [DataContractAttribute]
    public class Message
    {
      [DataMemberAttribute]
      public string success;

      public Message(string success)
        this.success = success;
    }


    [ServiceContract(Namespace="JsonpAjaxService")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class User
    {
        [WebInvoke(ResponseFormat = WebMessageFormat.Json, Method="POST")]
        public Message CreateUser(string email, string username, string password, string phone, string image)
        {
           Message msg = new Message("true");
           return msg;
        }
    }
}

service.svc:

<%@ServiceHost 
  language="c#"
  Debug="true"
  Service="Microsoft.Samples.Jsonp.CustomerService"
  Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" 
%>

サービスWeb.Config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
  <httpProtocol>
      <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" />
      </customHeaders>
  </httpProtocol>
</system.webServer>

<system.serviceModel>        
    <behaviors>
        <serviceBehaviors>
            <behavior name="MetadataBehavior">
                <serviceDebug includeExceptionDetailInFaults="True" httpHelpPageEnabled="True" />
                <serviceMetadata httpGetEnabled="True"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
        <webScriptEndpoint>
            <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
        </webScriptEndpoint>
    </standardEndpoints>
</system.serviceModel>

index.html

    wcfServiceUrl = "http://localhost:33695/Service.svc/CreateUser";

    $.ajax({
        crossDomain: true,
        cache: true,
        url: wcfServiceUrl,
        data: "{}",
        type: "POST",
        jsonpCallback: "Message",
        contentType: "application/json",
        dataType: "json",
        data: "{ \"myusername\": \"mypassword\" }",
        error: function (request, status, error) {
            //error loading data
            alert("error");
        },
        success: function (menu) {
            alert('success');
        }
    });
4

5 に答える 5

1

私はCORSなしでこれを行いました。私がしなければならなかったのは、サーバーがどこからでも電話を受けられるようにすることだけでした。これはApacheを使用して行われましたが、あなたのWebサーバーにも同様の機能があるようです。私が抱えていた問題は、許可されたドメインを指定する必要があることでした。*は機能しませんでした。また、http://site.exampleで指定する必要がありました

于 2012-06-01T15:51:56.977 に答える
1

Webサービスが別のサーバー上にある場合は、サーバーサイドアプリを使用して接続するか、JSONP(リクエストを取得)を使用する以外に選択肢はありません。他の回避策はありません。CORSは古いブラウザでは機能しません。

于 2012-06-01T16:02:17.033 に答える
0

http標準により、同一生成元ポリシーが有効になっている可能性があります。リクエストしているウェブサイトは別のアプリまたはポートの下にありますか?

見る:

http://en.wikipedia.org/wiki/Same_origin_policy

于 2012-05-31T17:25:38.627 に答える
0

CORS(HTML 5ソリューション)を使用したソリューションを見つけました http://code.msdn.microsoft.com/windowsdesktop/Implementing-CORS-support-c1f9cd4b

CORS(HTML 5)を使用しない実用的なソリューションを誰かが知っているなら、それは素晴らしいことです。私が間違っている場合は訂正してください。ただし、CORSにはHTML 5がサポートされているブラウザーが必要であり、HTML5ブラウザーに依存しないソリューションを好みます。

于 2012-06-01T15:40:44.803 に答える
0

私はうまくいく簡単な解決策を持っています。この問題を解決するには、次のようにします。

Global.asaxと次のコードを作成して、AjaxクロスドメインPOSTを有効にします

 public void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST,OPTIONS");

            if ((HttpContext.Current.Request.HttpMethod == "OPTIONS"))
            {

                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }
    }
于 2016-06-24T19:34:37.673 に答える