我已经尝试将自己的REST服务作为WCF服务,但是当我尝试从客户端POST服务时遇到问题。
以下是服务代码:
[ServiceContract]
public interface IBookService
{
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "AddBook/")]
string AddBook(HttpRequestMessage request);
}
public class BookService : IBookService
{
static IBookRepository repository = new BookRepository();
public string AddBook(HttpRequestMessage request)
{
try
{
// request is always empty.
var content = request.Content;
Book tempBook = JsonConvert.DeserializeObject<Book>(content.ReadAsStringAsync().Result);
repository.AddNewBook(tempBook);
}
catch (Exception ex)
{
//
}
return "AddBookTest";
}
}
以下是客户端代码:
var client = new HttpClient();
var url = new Uri("http://localhost:53258/");
client.BaseAddress = url;
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var tempBook = new Book() { BookId = 10, Title = "Title", ISBN = "123143234"};
var serializedBook = JsonConvert.SerializeObject(tempBook);
HttpContent content = new StringContent(serializedBook, Encoding.UTF8, "application/json");
var postResponse = _client.PostAsync("AddBook/", content).Result;
if (!postResponse.IsSuccessStatusCode)
// Always returns 400 Bad request.
POST调用AddBook方法,但HttpRequestMessage对象始终为空:
我现在已经研究了几个小时,但我无法想出另一个相对简单的解决方案。 任何善良的灵魂都可以帮助我找出我所缺少的东西?
编辑:Web.Config代码:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<services>
<service name="MyRestService.BookService" behaviorConfiguration="bookServiceBehavior">
<endpoint address=""
binding="webHttpBinding"
contract="MyRestService.IBookService"
behaviorConfiguration="RESTEndpointBehavior" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="RESTEndpointBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="bookServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
答案 0 :(得分:0)
这个答案奏效了。 我已经尝试了类似的东西,但我一定错过了一些东西。
https://stackoverflow.com/a/6836030/4063668
我最终在我的界面中声明了这个声明:
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "AddBook/", BodyStyle = WebMessageBodyStyle.Bare)]
string AddBook(Book request);