6

OperationContractデータベースにデータをクエリして挿入しようとする方法があります。メソッドを使用してPOST、ブラウザの JavaScript からサービスを呼び出しています。WCF サービスは同じドメインにあるため、使用する必要はありませんJSONP。また、データを変更しているので、POSTリクエストではなくリクエストである必要がありGETます。ただし、「メソッドは許可されていません」というエラーが引き続き発生します。誰かがこの状況に遭遇しましたか?

私のサービスはで呼び出されています

http://some_url.com/services/ProfileService.svc/json/CurrentUser

GET奇妙なことに、この URL にアクセスすると、 を指定したにもかかわらず、リクエスト経由で呼び出されるようPOSTです。ただし、ページの読み込み時には、POSTリクエストを試みているようです。

URL にアクセスしたときのブラウザの応答:

Request URL:http://some_url.com/services/ProfileService.svc/json/CurrentUser
Request Method:GET
Status Code:405 Method Not Allowed
Request Headersview parsed
GET /services/ProfileService.svc/json/CurrentUser HTTP/1.1

これが私が呼び出そうとしている私のメソッドです:

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json)]

public HIPUser GetCurrentUser()
{
    string[] domainUser;
    string Auth_User = HttpContext.Current.User.Identity.Name.ToString().ToLower();
    domainUser = Auth_User.Split('\\');
    string user = domainUser[1];
    Debug.WriteLine(user);

    ProfileManager pm = new ProfileManager();
    var results = pm.GetUserByUserName(user);

    if (results.Length > 0)
    {
        return results.First();
    }
    else
    {
        Debug.WriteLine("IS NULL");
        var x = pm.CreateUser(user, null, null);
        Debug.WriteLine(x.UserName);
        return x;
    }
}

クライアント:

function getCurrentUser() {

$.ajax({
    type: "POST",
    url: "services/ProfileService.svc/json/GetCurrentUser",
    contentType: "application/json; charset=utf-8",
    data: null,
    dataType: "json",
    error: function (request, error, u) {
        alert('blargherror: ' + error);
    },
    success: function (result, status) {
        alert(result.d);
    }
});
}

必要かどうかはわかりませんがWeb.Config

<behaviors>
   <endpointBehaviors>
        <behavior name="jsonBehavior">
            <enableWebScript />
        </behavior>
    </endpointBehaviors>

    <serviceBehaviors>
        <behavior name="metaBehavior">
            <serviceDebug includeExceptionDetailInFaults="true" />
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
    </serviceBehaviors>
</behaviors>

<serviceHostingEnvironment 
    aspNetCompatibilityEnabled="true"
    multipleSiteBindingsEnabled="true" />

<services>
    <service name="ProfileService" behaviorConfiguration="metaBehavior">
        <endpoint address="/json" 
            behaviorConfiguration="jsonBehavior"
            binding="webHttpBinding" 
            bindingConfiguration="secure" 
            contract="ProfileService" />
        <endpoint address="" 
            binding="basicHttpBinding" 
            bindingConfiguration="secure" 
            contract="ProfileService" />
    </service>
</services>

Web.Config の編集 - バインディングの追加

<bindings>
        <webHttpBinding>
            <binding name="secure">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows"/>
                </security>
            </binding>
        </webHttpBinding>
        <basicHttpBinding>
            <binding name="secure">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
4

1 に答える 1

1

私はこれを理解することができました。返されるオブジェクトが不明な型であるという問題があったため、オブジェクトにシリアル化できませんでしたJSON。オブジェクトをシリアル化してメソッドで動作させる方法がわからなかったので、メソッドを変更して独自のカスタム文字列を構築する文字列を返し、関数をJSON使用してそれをオブジェクトに変換しました。eval()JSON

于 2012-07-11T15:02:59.510 に答える