4

次のような ASP.NET WebService があります。

[WebMethod]
public static void DoSomethingWithStrings(string stringA, string stringB)
{
    // and so on
}

サードパーティ アプリケーションは、この Web サービスを呼び出す必要があります。ただし、このアプリケーションは文字列を UTF-8 としてエンコードし、すべてのウムラウトは「??」に置き換えられます。呼び出しを表示でき、特殊文字は適切にフォーマットされています。

<?xml version="1.0" encoding="utf-8" ?>
<!-- ... -->
<SoapCall>
    <DoSomethingWithStrings>
        <stringA>Ä - Ö - Ü</stringA>
        <stringB>This is a test</stringB>
    </DoSomethingWithStrings>
</SoapCall>

これにより、webservice メソッド内の文字列を単純に出力すると、次の出力が生成されます。

?? - ?? - ??

これはテストです

UTF-8 でエンコードされた文字列を受け入れるように WebService を構成するにはどうすればよいですか?

アップデート

Fiddler は、http 要求の content-type charset が UTF-8 であることも教えてくれます。

更新 2

global.asaxデバッグ目的で次のコードを追加しようとしました:

public void Application_BeginRequest(object sender, EventArgs e)
{
    using (var reader = new System.IO.StreamReader(Request.InputStream))
    {
        string str = reader.ReadToEnd();
    }
}

これにより、実際の SOAP 呼び出しが読み取られます。StreamReaders エンコーディングは UTF-8 に設定されています。SOAP 呼び出しは正しいようです。

<?xml version="1.0" encoding="UTF-8" ?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <DoSomethingWithStrings xmlns="http://www.tempuri.org/">
            <stringA>Ä - Ö - Ü</stringA>
            <stringB>This is a test!</stringB>
        </DoSomethingWithStrings>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

web.configファイルでは、グローバリゼーション設定が正しく設定されています。

<globalization requestEncoding="UTF-8" responseEncoding="UTF-8" culture="de-DE" uiCulture="de-DE" />

そのため、SOAP メッセージをデシリアライズするものは UTF-8 ではなく ASCII エンコーディングを使用しているようです。

4

4 に答える 4

6

最後に、HTTP メッセージの受け入れで問題が発生したことが判明しました。何が HTTP リクエストを操作しているのかは実際にはわかりませんが、これに対する回避策を見つけました。Fiddler は正しいコンテンツ タイプ ( text/xml; charset=utf-8) を表示しましApplication_BeginRequestRequest.RequestContext.HttpContext.Request.ContentTypetext/xml、これは ASMX シリアライザー内のデフォルト (ASCII) エンコーディングへのフォールバックにつながります。次のコードをApplication_BeginRequestハンドラーに追加しましたが、今のところすべてが機能しています。

if (Request.RequestContext.HttpContext.Request.ContentType.Equals("text/xml"))
{
    Request.RequestContext.HttpContext.Request.ContentType = "text/xml; charset=UTF-8";
}

ご協力いただきありがとうございます!

于 2012-12-05T08:57:50.797 に答える
0

これを試して:-

  byte[] bytes=Encoding.UTF8.GetBytes(yourString);

ノート:-

文字列にutf-*やその他のエンコードされたものが含まれることはありません

于 2012-12-04T14:43:29.650 に答える
0

私も同じ問題を抱えていました。Asmx Web サービスは、私の UTF-8 を ASCII に、または ?????? に変換しました。あなたの投稿は私を大いに助けました。私が見つけた解決策は、SOAP プロトコルのバージョンを 1.1 から 1.2 に変更することでした。

POST /WebService1.asmx HTTP/1.1
Host: www.tempuri.org
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.tempuri.org/HelloWorld"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <HelloWorld xmlns="http://www.tempuri.org/">
        <inputParam>Привет</inputParam>
    </HelloWorld>
  </soap:Body>
</soap:Envelope>

問題がありました。しかし、リクエストを SOAP 1.2 に変更すると、次のようになります。

POST /WebService1.asmx HTTP/1.1
Host: www.tempuri.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <HelloWorld xmlns="http://www.tempuri.org/">
       <inputParam>Привет</inputParam>
    </HelloWorld>
  </soap12:Body>
</soap12:Envelope>

問題は解決しました。

于 2013-03-12T10:02:55.740 に答える
0

SOAP 呼び出しはどこかで ASCII としてデコードされています。各ウムラウトは 2 バイトで、上位ビットが設定??されており、ASCII としてデコードされると になります。

したがって、次のようなことが起こっています。

byte[] bytesSentFromClient = Encoding.UTF8.GetBytes("Ä - Ö - Ü");
string theStringIThenReceiveInMyMethod = Encoding.ASCII.GetString(bytesSentFromClient);
Console.WriteLine(theStringIThenReceiveInMyMethod);
//?? - ?? - ??

これが確実に起こっていることを確認するには、stringA == "Ä - Ö - Ü"どこかに印刷するのではなく、比較する必要があります。

プロジェクト全体で「ASCII」を検索することから始めて、何かが見つかったらそこから作業できると思います。

あなたも試すことができます

<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>

ファイル内の<system.web>タグの下。Web.config

于 2012-12-04T16:06:09.747 に答える