2012-01-09 15 views
2

単純なWCF RESTful Webサービスを作成しようとしていましたが、SOAPモードでしか動作しないようです。私は、ローカルのIISで私のサービスをホストしています。WCF REST ServiceがHTTP 400 Bad Requestを返す

それは本当に標準になります。

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    Guid Login(string username, string password); 
... 

と:

public class MyService : IMyService 
{ 
    [WebGet(UriTemplate = "login?user={user}&password={password}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    public Guid Login(string username, string password) 
    { 
     return Guid.Empty; 
    } 

私も設定ファイルに行動を含んでおり、それを使用していた。すべてに応じ

<endpoint address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="webHttp"/> 

私が知っている例のうち...

これは、ServiceReferenceを使用するスタブクライアントからログインを呼び出すときに、Fiddlerではうまく見えますが、SOAPyです。 何らかの理由で私はRESTyの方法で私のサービスを呼び出すことができません、/ helpでも400の悪い要求を返すようです。 (私はhttp://localhost:8080/MyService.svc/helpまたは/ loginなどを呼び出しています)

RESTが何を行うのを妨げているのでしょうか? 事前に感謝:)

編集:私は答えを見つけました。

これは、1つは、Global.asaxのにこれを追加した後ルーティング ...

を定義する必要があり判明:

protected void Application_Start(object sender, EventArgs e) 
    { 
     RouteTable.Routes.Add(new ServiceRoute("MyService", 
      new WebServiceHostFactory(), typeof(MyService))); 
    } 

それがうまく通り抜けました。

さらに、「.svc」がURLの一部ではないことがわかりました。

+0

一般的な注意点として、GETによるログインは、概念的には状態の変化であるため、悪い習慣とみなされます。 POSTを使用します(設定はHTTPS経由)。 –

+0

RESTサービスを呼び出すには、クライアント側でAdd Service Referenceを実行しないでください。 RESTfulな方法でHttpWebRequestクラスを呼び出す必要があります。 – Rajesh

答えて

1

あなたのコードはよかったです。いくつか試してみてください

[OperationContract] 
[WebGet(UriTemplate = "/Login/{username}/{password}", ResponseFormat = WebMessageFormat.Xml)] 
Guid Login(string username, string password); 

同時に、MyService.Login機能からWebGet属性を削除してください。

-OR-

・ホープ、このことができますのsystem.web下web.configファイルに

<webServices> 
    <protocols> 
    <add name="HttpGet"/> 
    <add name="HttpPost"/> 
    </protocols> 
</webServices> 

をこのブロックを置きます。

+0

まだ何も:( 私が得るのは: 'HTTP/1。1 400 Bad Request サーバー:Microsoft-IIS/7.5 X-Powered-By:ASP.NET 日付:2012年1月9日12:22:22 GMT コンテンツ長:0' – Jacob

+0

この 1つの動作

+0

私はこの正確な設定を使用しています! ( "RestFriendly"の代わりに、名前だけが異なります。 "webHttp"を使用していますが、変数名のようには関係ありません...) – Jacob

1

は、私はその理由は、私の投稿のxmlが

<?xml version="1.0" encoding="utf-16"?> 

トップ

に以下の持っていただった 同じ問題を持っていた私はそれを取り出して、それだけで働いていました!

+0

HTTPのXMLはUTF-8のみです。 – jinzai