2

多くのチュートリアルを読みましたが、プロジェクトでこれを実行できませんでした。データを送信するGETサービスをいくつか作成しましたが、それらはうまく機能しますが、データの受信に問題があります。リンクを投稿する代わりに、誰かが私が失敗した場所を教えてくれたら本当にありがたいです。:)ブラウザでサービスを呼び出そうとすると、次のエラーが発生します:メソッドは許可されていません。しかし、これは最初のエラーにすぎないと思います。

これが私のコードです。まず、サービスを呼び出すAndroidのコード:

public class MainActivity extends Activity {

String SERVICE_URI = "http://10.0.2.2:51602/RestServiceImpl.svc";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    HttpPost request = new HttpPost(SERVICE_URI + "/registerUser");
    request.setHeader("Accept", "application/json");
    request.setHeader("Content-type", "application/json");

    try {
        JSONStringer user = new JSONStringer()
                .object()
                .key("userInfo")
                .object()
                    .key("Email").value("mail")
                    .key("Password").value("pass")
                    .key("Cauntry").value("country")
                    .key("UserName").value("username")
                .endObject()
        .endObject();

        StringEntity entity = new StringEntity(user.toString());
        request.setEntity(entity);

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpResponse response = httpClient.execute(request);


        } catch (JSONException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

IRestServiceImpl.cs:

[ServiceContract]
public interface IRestServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "registerUser",
        BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    void receiveData(String data);
}

RestServiceImpl.cs:

public class RestServiceImpl : IRestServiceImpl
{
    public void receiveData(String data)
    {
        //some code
    }
}

Web.config:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="RestService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour">

        <endpoint address ="" binding="webHttpBinding" contract="RestService.IRestServiceImpl" behaviorConfiguration="web">

        </endpoint>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>
4

1 に答える 1

2

問題は、JSONオブジェクトを操作に渡しているが、操作はJSON文字列を予期していることです。私がJavaコードを正しく理解している場合、これはあなたが送信しているものです:

{
    "userInfo" : {
        "Email" : "mail",
        "Password" : "pass",
        "Cauntry" : "country",
        "UserName" : "username"
    }
}

これはJSON文字列ではありません。

できることがいくつかあります。最初の方法は、文字列を取得するのではなく、そのオブジェクトと同等のデータコントラクトを取得するように操作を変更することです。

コードは次のようになります。Bare本文の形式も(ではなく)に変更する必要があることに注意してくださいWrapped

public class RequestData
{
    public UserInfo userInfo { get; set; }
}

public class UserInfo
{
    public string Email { get; set; }
    public string Password { get; set; }
    public string Cauntry { get; set; } // typo to match the OP
    public string UserName { get; set; }
}

[ServiceContract]
public interface IRestServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "registerUser",
        BodyStyle = WebMessageBodyStyle.Bare,
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    void receiveData(RequestData data);
}

別の方法として、データの「スキーマ」が毎回変更される場合は、入力を(文字列ではなく)ストリームとして受け取ることです。そうすれば、基本的にすべての入力を受け入れることができるはずです。コンテンツタイプマッパーも必要になる場合があります。このシナリオの詳細については、http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiveing-arbitrary-data.aspxを参照してください。

于 2012-12-11T21:50:27.740 に答える