Как вернуть необработанную строку с ApiController?
У меня есть ApiController, который обслуживает XML/JSON, но я хотел бы, чтобы одно из моих действий возвратило чистый HTML. Я попробовал следующее, но он все равно возвращает XML/JSON.
public string Get()
{
return "<strong>test</strong>";
}
Это то, что возвращается выше:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"><strong>test</strong></string>
Есть ли способ вернуть только чистый, неэкранированный текст без даже окружающих тегов XML (возможно, другой атрибут возвращаемого типа действия)?
Ответы
Ответ 1
Вы можете вернуть действие веб-Api HttpResponseMessage
, для которого вы полностью контролируете контент. В вашем случае вы можете использовать StringContent и указать правильный тип контента:
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent(
"<strong>test</strong>",
Encoding.UTF8,
"text/html"
)
};
}
Ответ 2
Просто return Ok(value)
не будет работать, он будет рассматриваться как IEnumerable<char>
.
Вместо этого используйте return Ok(new { Value = value })
или simillar.
Ответ 3
Другое возможное решение. В Web API 2 я использовал метод base.Content() APIController
:
public IHttpActionResult Post()
{
return base.Content(HttpStatusCode.OK, new {} , new JsonMediaTypeFormatter(), "text/plain");
}
Мне нужно было сделать это, чтобы обойти ошибку IE9, где она пыталась загрузить содержимое JSON. Это также должно работать для данных типа XML, используя форматтера XmlMediaTypeFormatter
.
Надеюсь, что это поможет кому-то.
Ответ 4
Мы должны стремиться не возвращать html, а чистые данные из нашего API и соответственно форматировать данные в пользовательском интерфейсе, но, возможно, вы можете использовать:
return this.Request.CreateResponse(HttpStatusCode.OK,
new{content=YourStringContent})
он работает для меня
Ответ 5
Я вызываю следующий метод контроллера webapi2 из метода контроллера mvc:
<HttpPost>
Public Function TestApiCall(<FromBody> screenerRequest As JsonBaseContainer) As IHttpActionResult
Dim response = Me.Request.CreateResponse(HttpStatusCode.OK)
response.Content = New StringContent("{""foo"":""bar""}", Encoding.UTF8, "text/plain")
Return ResponseMessage(response)
End Function
Я вызываю это из этой процедуры на сервере asp.net:
Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As String, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String)
Return Await PostJsonContent(baseUri, requestUri, New StringContent(content, Encoding.UTF8, "application/json"), timeout, failedResponse, ignoreSslCertErrors)
End Function
Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As HttpContent, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String)
Dim httpResponse As HttpResponseMessage
Using handler = New WebRequestHandler
If ignoreSslCertErrors Then
handler.ServerCertificateValidationCallback = New Security.RemoteCertificateValidationCallback(Function(sender, cert, chain, policyErrors) True)
End If
Using client = New HttpClient(handler)
If Not String.IsNullOrWhiteSpace(baseUri) Then
client.BaseAddress = New Uri(baseUri)
End If
client.DefaultRequestHeaders.Accept.Clear()
client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
client.Timeout = New TimeSpan(TimeSpan.FromSeconds(timeout).Ticks)
httpResponse = Await client.PostAsync(requestUri, content)
If httpResponse.IsSuccessStatusCode Then
Dim response = Await httpResponse.Content.ReadAsStringAsync
If Not String.IsNullOrWhiteSpace(response) Then
Return response
End If
End If
End Using
End Using
Return failedResponse
End Function
Ответ 6
Если вы используете MVC, а не WebAPI, вы можете использовать метод base.Content:
return base.Content(result, "text/html", Encoding.UTF8);