[C#] WebGet用のWCF ResponseFormat


Answers

使用してみてください

BodyStyle = WebMessageBodyStyle.Bare

次に、関数からSystem.IO.Streamを返します。

データベースから画像を返すために使用するコードですが、URLでアクセスできます:

[OperationContract()]
[WebGet(UriTemplate = "Person/{personID}/Image", BodyStyle = WebMessageBodyStyle.Bare)]
System.IO.Stream GetImage(string personID);

実装:

public System.IO.Stream GetImage(string personID)
{
    // parse personID, call DB

    OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;

    if (image_not_found_in_DB)
    {
        context.StatusCode = System.Net.HttpStatusCode.Redirect;
        context.Headers.Add(System.Net.HttpResponseHeader.Location, url_of_a_default_image);
        return null;
    }

    // everything is OK, so send image

    context.Headers.Add(System.Net.HttpResponseHeader.CacheControl, "public");
    context.ContentType = "image/jpeg";
    context.LastModified = date_image_was_stored_in_database;
    context.StatusCode = System.Net.HttpStatusCode.OK;
    return new System.IO.MemoryStream(buffer_containing_jpeg_image_from_database);
}

あなたの場合、生の文字列を返すには、ContentTypeを "text / plain"のように設定し、データをストリームとして返します。 推測すると、次のようなものです:

return new System.IO.MemoryStream(ASCIIEncoding.Default.GetBytes(string_to_send));
Question

WCFはServiceContractのWebGetアノテーションのResponseFormat属性に2つのオプションを提供します。

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(UriTemplate = "greet/{value}", BodyStyle = WebMessageBodyStyle.Bare)]
    string GetData(string value);

    [OperationContract]
    [WebGet(UriTemplate = "foo", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    string Foo();

ResponseFormatのオプションは、WebMessageFormat.JsonとWebMessageFormat.Xmlです。 自分のWebメッセージフォーマットを書くことは可能ですか? クライアントがfoo()メソッドを呼び出すと、jsonまたはxmlラッパーを使用せずにraw文字列を取得したいと思います。




あなたがHTTPを扱っている場合、これを達成する方法の1つがあります。それはちゃんといいのではありませんが、私はそれについて言えると思いました。

メソッドの戻り値の型をvoidに設定し、生の文字列を直接応答に出力することができます。

[OperationContract]
[WebGet(UriTemplate = "foo")]
void Foo()
{
   HttpContext.Current.Response.Write("bar");
}