я следующий код для службы под названием AuthenticationService
:InvalidOperationException при вызове метода службы WCF RESTful с несколькими аргументами?
IAuthenticationService.cs
[ServiceContract]
public interface IAuthenticationService
{
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
bool Login(string username, string password, string applicationName);
}
AuthenticationService.svc.cs
public sealed class AuthenticationService : IAuthenticationService
{
public bool Login(string username, string password, string applicationName)
{
// TODO: add the logic to authenticate the user
return true;
}
}
Web.config
<system.serviceModel>
<!-- START: to return JSON -->
<services>
<service name="ImageReviewPoc.Service.AuthenticationService">
<endpoint contract="ImageReviewPoc.Service.Contracts.IAuthenticationService" binding="webHttpBinding" behaviorConfiguration="jsonBehavior"/>
</service>
</services>
<!-- END: to return JSON -->
<behaviors>
<!-- START: to return JSON -->
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
<!-- END: to return JSON -->
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add scheme="http" binding="webHttpBinding"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
и у меня есть следующее консольное приложение, использующее услугу:
Program.cs
internal class Program
{
private static void Main(string[] args)
{
Login().Wait();
}
private static async Task Login()
{
var client = new AuthenticationServiceClient();
var ok = await client.LoginAsync("User", "Password!", "Console Application");
client.Close();
Console.WriteLine(ok);
}
}
App.config
<system.serviceModel>
<client>
<endpoint address="http://localhost:62085/AuthenticationService.svc/"
binding="webHttpBinding"
contract="AuthenticationServiceReference.IAuthenticationService"
kind="webHttpEndpoint" />
</client>
</system.serviceModel>
я использовал Postman для тестирования служба, отправляющая следующий JSON данные, и она работала:
{"username": "reviewer", "password": "456", "applicationName": "123"}
Однако, когда я тестировал услугу с помощью консольного приложения я получил
System.InvalidOperationException: Операция «Вход» договора «IAuthenticationService» задает несколько параметров запроса тела для сериализации без каких-либо элементов оболочки. Не более одного параметра тела можно сериализовать без элементов обертки. Удалите дополнительные параметры тела или установите свойство BodyStyle в атрибуте WebGetAttribute/WebInvokeAttribute для обертывания.
Как вы можете видеть из IAuthenticationService.cs
кода, я уже установлен BodyStyle
в Wrapped
. Может ли кто-нибудь привести меня к тому, что я делаю неправильно здесь?
Обратите внимание на следующее:
- Я уже искать Stackoverflow и Интернет для решения. Почти все решения касаются настройки
BodyStyle
. Возможно, это помогло другим, но не очень помогло мне. - Я пробовал оба
Login
иLoginAsync
; это тот же результат - Я ссылался на услугу, добавив ее через «Добавить служебную ссылку» в Visual Studio 2013 (окончательная версия, если вам интересно)
- Я знаю, что могу позвонить услуге, используя другие способы; например, HttpClient, но то, что я хочу знать, является причиной того, что автогенерированный клиент не работает.
Вы уже обновили свою служебную ссылку на стороне клиента после изменения в 'BodyStyle'? – khlr
Я думаю, запрос json, который идет, не является правильным. вы можете проверить с помощью скрипача и посмотреть, что будет делать запрос. может быть запрос плохо сформирован ... – Saravanan
@khlr, да, я изменил сервис и обновил ссылку не менее 739 000 раз :) – TheBlueSky