Ошибка в типизированном или нетипизированном сообщении: веб-службы в Unity (WSDL) - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь использовать веб-сервисы в Unity. Я сделал прокси-класс моего веб-сервиса, используя svcutil. Прокси-класс очень длинный, я просто опубликую здесь метод, который я вызываю в моем C #-скрипте.

В моем прокси-классе у меня есть:

public bool LoginClic(string szUserName, string szPassword)
{
    LoginClicRequest inValue = new LoginClicRequest();
    inValue.Body = new LoginClicRequestBody();
    inValue.Body.szUserName = szUserName;
    inValue.Body.szPassword = szPassword;
    LoginClicResponse retVal = ((UserServiceSoap)(this)).LoginClic(inValue);
    return retVal.Body.LoginClicResult;
}

Мой C # скрипт выглядит так и активируется, когда пользователь нажимает кнопку на Unity

public class LoginButton : MonoBehaviour 
{

    public GameObject login;
    public GameObject password;

    private InputField loginField;
    private InputField passwordField;

    // Use this for initialization
    void Start ()
    {
        loginField = login.GetComponent<InputField>();
        passwordField = password.GetComponent<InputField>();
    }

    public void PressLogin()
    {
        string szLogin, szPassword;

        szLogin = loginField.text;
        szPassword = passwordField.text;

        UserServiceSoapClient user = new UserServiceSoapClient(new BasicHttpBinding(),
                                  new EndpointAddress("http://localhost/WebService/UserService.asmx"));

        if (user.LoginClic(szLogin, szPassword))
        {
            Debug.Log("Sucess");
        }
        else
        {
            Debug.Log("Failure");
        }
    }
}

Дело в том, что когда я использую эту кнопку, я получаю исключение, которое говорит:

InvalidOperationException: Operation 'LoginClicAsync' contains a message with parameters. Strongly-typed or untyped message can be paired only with strongly-typed, untyped or void message.
System.ServiceModel.Dispatcher.OperationFormatter.Validate (System.ServiceModel.Description.OperationDescription od, System.Boolean isRpc, 
System.Boolean isEncoded) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.Dispatcher.OperationFormatter..ctor (System.ServiceModel.Description.OperationDescription od, System.Boolean isRpc, 
System.Boolean isEncoded) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.Description.ContractDescription.PopulateClientOperation (System.ServiceModel.Dispatcher.ClientRuntime proxy, 
System.ServiceModel.Description.OperationDescription od, System.Boolean isCallback) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.Description.ContractDescription.FillClientOperations (System.ServiceModel.Dispatcher.ClientRuntime proxy, System.Boolean isCallback) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.Description.ContractDescription.CreateClientRuntime (System.Object callbackDispatchRuntime) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.Description.ServiceEndpoint.CreateClientRuntime (System.Object callbackDispatchRuntime) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.MonoInternal.ClientRuntimeChannel..ctor (System.ServiceModel.Description.ServiceEndpoint endpoint, 
System.ServiceModel.ChannelFactory channelFactory, 
System.ServiceModel.EndpointAddress remoteAddress, System.Uri via) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.ChannelFactory`1[TChannel].CreateChannel (System.ServiceModel.EndpointAddress address, System.Uri via) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.ChannelFactory`1[TChannel].CreateChannel (System.ServiceModel.EndpointAddress address) (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.ChannelFactory`1[TChannel].CreateChannel () (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.ClientBase`1[TChannel].CreateChannel () (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.ClientBase`1[TChannel].get_InnerChannel () (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
System.ServiceModel.ClientBase`1[TChannel].get_Channel () (at <40d7d6933b0c4e6f97e3ac69c092efd6>:0)
UserServiceSoapClient.UserServiceSoap.LoginClic (LoginClicRequest request) (at Assets/Script/WebService/UserService.cs:238)
UserServiceSoapClient.LoginClic (System.String szUserName, System.String szPassword) (at Assets/Script/WebService/UserService.cs:247)
LoginButton.PressLogin () (at Assets/Script/Login/LoginButton.cs:32)
UnityEngine.Events.InvokableCall.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:166)
UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:58)
UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:36)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:45)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, 
UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)
UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, 
UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)
UnityEngine.EventSystems.EventSystem:Update()

Поскольку прокси-класс создан, я чувствую, что не должен его трогать, поэтому мне было интересно, что плохого я сделал, что могло вызвать это? Мой метод принимает 2 строки в качестве параметра и возвращает логическое значение.

Я не уверен, что это будет очень полезно, но вот как этот метод выглядит в WSDL:

<s:element name="LoginClic">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="szUserName" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="szPassword" type="s:string"/>
        </s:sequence>
    </s:complexType>
</s:element>
<s:element name="LoginClicResponse">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="LoginClicResult" type="s:boolean"/>
        </s:sequence>
    </s:complexType>
</s:element>

Большое спасибо за помощь и хорошего дня.

РЕДАКТИРОВАТЬ 1: После нескольких часов исследований я чувствую, что у меня могут быть те же проблемы, что и у этих парней: https://github.com/dotnet/wcf/issues/1808, но они так и не нашли, как это исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...