[解決済み] AndroidでWCFサービスを利用する方法
質問
.NETでサーバー、Androidでクライアントアプリケーションを作成しています。ユーザー名とパスワードをサーバーに送信し、サーバーからセッション文字列が返信される認証方式を実装したいのですが、可能でしょうか?
WCFに詳しくないので、ぜひご協力をお願いします。
javaでは以下のようなメソッドを書きました。
private void Login()
{
HttpClient httpClient = new DefaultHttpClient();
try
{
String url = "http://192.168.1.5:8000/Login?username=test&password=test";
HttpGet method = new HttpGet( new URI(url) );
HttpResponse response = httpClient.execute(method);
if ( response != null )
{
Log.i( "login", "received " + getResponse(response.getEntity()) );
}
else
{
Log.i( "login", "got a null response" );
}
} catch (IOException e) {
Log.e( "error", e.getMessage() );
} catch (URISyntaxException e) {
Log.e( "error", e.getMessage() );
}
}
private String getResponse( HttpEntity entity )
{
String response = "";
try
{
int length = ( int ) entity.getContentLength();
StringBuffer sb = new StringBuffer( length );
InputStreamReader isr = new InputStreamReader( entity.getContent(), "UTF-8" );
char buff[] = new char[length];
int cnt;
while ( ( cnt = isr.read( buff, 0, length - 1 ) ) > 0 )
{
sb.append( buff, 0, cnt );
}
response = sb.toString();
isr.close();
} catch ( IOException ioe ) {
ioe.printStackTrace();
}
return response;
}
しかし、サーバー側では今のところ何もわかっていない。
この2つのパラメータをクライアントから読み込んでセッション文字列を返信するために、適切なApp.config設定と適切な[OperationContract]署名を持つ適切なメソッド文字列 Login(string username, string password) を作成する方法を説明していただけると本当に感謝します。
ありがとうございます。
解決方法は?
WCFを使い始めるには、WebサービスバインディングにデフォルトのSOAPフォーマットとHTTP POST(GETではなく)を使用するのが最も簡単かもしれません。 最も簡単に動作させることができるHTTPバインディングは、"basicHttpBinding"です。 以下は、ログインサービスのServiceContract/OperationContractの例です。
[ServiceContract(Namespace="http://mycompany.com/LoginService")]
public interface ILoginService
{
[OperationContract]
string Login(string username, string password);
}
サービスの実装は次のようになります。
public class LoginService : ILoginService
{
public string Login(string username, string password)
{
// Do something with username, password to get/create sessionId
// string sessionId = "12345678";
string sessionId = OperationContext.Current.SessionId;
return sessionId;
}
}
ServiceHostを使用してWindowsサービスとしてホストすることもできますし、通常のASP.NET Web(サービス)アプリケーションのようにIISでホストすることもできます。 この両方について、多くのチュートリアルがあります。
WCFサービスの設定は、以下のようになります。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="LoginServiceBehavior">
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="WcfTest.LoginService"
behaviorConfiguration="LoginServiceBehavior" >
<host>
<baseAddresses>
<add baseAddress="http://somesite.com:55555/LoginService/" />
</baseAddresses>
</host>
<endpoint name="LoginService"
address=""
binding="basicHttpBinding"
contract="WcfTest.ILoginService" />
<endpoint name="LoginServiceMex"
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>
(MEX のものは実運用ではオプションですが、WcfTestClient.exe でのテストと、サービスのメタデータを公開するために必要です)。
サービスにSOAPメッセージをPOSTするために、Javaコードを修正する必要があります。 WCFは非WCFクライアントと相互運用するときに少しうるさいので、POSTヘッダを少しいじって動作させる必要があります。 これを実行したら、ログインのセキュリティ(より良いセキュリティを得るために別のバインディングを使用する必要があるかもしれません)、またはSOAP/POSTではなくGETでログインできるようにWCF RESTを使用する可能性を調査し始めることができます。
以下は、JavaコードからHTTP POSTがどのようなものであるかの例です。 "というツールがあります。 フィドラー ウェブサービスをデバッグするのにとても便利です。
POST /LoginService HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://mycompany.com/LoginService/ILoginService/Login"
Host: somesite.com:55555
Content-Length: 216
Expect: 100-continue
Connection: Keep-Alive
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Login xmlns="http://mycompany.com/LoginService">
<username>Blah</username>
<password>Blah2</password>
</Login>
</s:Body>
</s:Envelope>
関連
-
[解決済み] リファレンスの追加にSystem.Web.Mvcが表示されないのはなぜですか?
-
[解決済み] フレームワークとアーキテクチャの違いは何ですか?[クローズド]
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] enumを列挙するには
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] ファイル *.mdf をデータベースとしてアタッチできない
-
[解決済み] ポストバックまたはコールバックの引数が無効です。 イベント検証は '<pages enableEventValidation="true"/>' を使用して有効になっています。
-
[解決済み] Marginのプロパティ順
-
[解決済み] 16進数値0x00は無効な文字です。
-
[解決済み] NetFx45WebLinkとNetFx45RedistLinkの違いは何ですか?
-
[解決済み] 到達不能なホストに対してソケット操作を行おうとした
-
[解決済み] System.Timers.Timer vs System.Threading.Timer
-
[解決済み] Visual Studioの「Any CPU」ターゲットはどういう意味ですか?
-
[解決済み] PowerShellで文字列がNULLまたは空であるかどうかを確認するにはどうすればよいですか?
-
[解決済み] WCF - メッセージサイズのクォータを増加させる方法