2017-03-31 5 views
0

こんにちはすべての熱心なプログラマー。 私は、コードはすべての作品 web-apiプロジェクトの特殊文字を送信

private const string Url = "http://localhost:61809/"; 
    public ItemService() 
    { 

     _httpClient.DefaultRequestHeaders.Accept.Clear(); 
     _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    } 


public async Task<IEnumerable<Item>> GetItemsAsync(string searchString) 
    { 
     List<Items> = null; 
     string path = @"api/item/" + searchString; 
     HttpResponseMessage response = await _httpClient.GetAsync(Url+path).ConfigureAwait(false); 
     if (response.IsSuccessStatusCode) 
     { 
      items = await response.Content.ReadAsAsync<List<Item>>().ConfigureAwait(false); 
     } 
     return items; 
    } 

以下が、それが失敗した文字#が含まれていwhcih項目の後に見ればのように見えるウェブAPIプロジェクト へのC#クライアントからの呼び出しを受ける作っています。私が項目C Mastering C#を探すと失敗します。私はバックエンド側でもこれをデバッグしており、バックエンドのコンテンツには文字#は含まれていません。内容はMastering Cですが、もちろん失敗します。 郵便配達員からリクエストを送信した場合も同様です 私はそれを動作させるために何ができますか?バックエンドコードの特別なエンコーディングや設定

+0

は '' System.Web.HttpUtility.UrlEncode(パス)を使用してみてください –

答えて

1

はい、エンコードする必要があります。私はこれを正しく行うa libraryを書いている途中ですが、まだリリースされていません。一方

、次のようなパーセントエンコーディングを使用することができます。

public class UrlEncoding 
{ 
    public static Encoding Utf8EncodingWithoutBom { get; } = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false); 

    public static string PercentEncodePathSegment(string value) 
    { 
    var bytes = Utf8EncodingWithoutBom.GetBytes(value); 
    var sb = new StringBuilder(bytes.Length); 
    foreach (var ch in bytes) 
    { 
     if (ch == '-' || ch == '.' || ch == '_' || ch == '~' || 
      (ch >= '0' && ch <= '9') || 
      (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'Z') || 
      ch == '!' || ch == '$' || ch == '&' || ch == '\'' || 
      ch == '(' || ch == ')' || ch == '*' || ch == '+' || 
      ch == ',' || ch == ';' || ch == '=' || 
      ch == ':' || ch == '@') 
     { 
     sb.Append((char)ch); 
     } 
     else 
     { 
     sb.Append("%" + ch.ToString("X2", CultureInfo.InvariantCulture)); 
     } 
    } 
    return sb.ToString(); 
    } 
}