使用Azure应用服务托管的WCF服务出错:HTTP错误405.0 - 方法不允许

问题描述 投票:0回答:1

好的,这里有WCF的新手,所以请耐心等待。

我在Azure应用服务上发布了WCF Web服务,以及必须连接到该服务的Xamarin.forms应用程序。

我做了WCF服务,起初我试图自己托管它,我通过使用visual studio 2017“添加服务”在我的xamarin应用程序上创建了客户端。所以它添加了Reference.cs文件,我创建了代理类和接口来连接到服务,什么不是。

我在从移动设备连接到服务时遇到问题,因此我在Azure应用服务中发布了该服务(毕竟它是免费的),启用了Azure日志,修改了NLog.config文件以登录到跟踪,仅修改了我的移动设备中的URL应用程序,现在每次我尝试通过手机连接时,服务都会抛出这个:

HTTP错误405.0 - 不允许的方法。由于使用了无效的方法(HTTP动词),因此无法显示您要查找的页面。

我正在qazxsw poi文件夹中的Visual Studio Cloud Explorer中读取错误。

老实说,我对HTTP几乎一无所知,但我知道我没有在服务中编写HTTP。我想WCF在某些地方使用它并且在某个时刻使用了一个不好的动词,但我怎么知道在哪里改变它甚至如何检查呢?我刚刚创建了一个接口,一个类,并调用该类的方法...不知道在哪里寻找POST或GET。

无论如何,我甚至不确定我应该在这里发布什么代码,但我已经阅读了很多关于这个的问题,所以这里有一些:

服务类

LogFiles\DetailedErrors

接口

public class MJRFFrasCdadesService : IMJRFFrasCdadesService, IDisposable
{
    private Users.UsersClass _Users = new Users.UsersClass();
    private static NLog.Logger _Logger = NLog.LogManager.GetCurrentClassLogger();
    private bool _Disposed;

    public static event EventHandler<ConnectionEventArgs> ConnectionEvent;
    public static event EventHandler<ConnectionEventArgs> DisconnectionEvent;

    public string Ping()
    {
        return "Ok";
    }

    public async Task<string> GoogleLoginAsync(string email)
    {
        NLog.LogManager.Configuration.Variables["email"] = "";
        _Logger.Info("{1}{2}{1}           Comienza google login con email: {0}{1}{2}",
            email,
            Environment.NewLine,
            "-----------------------------------*******************************************");

        var driveHandler = await _Users.NewUserAsync(email);

        try
        {
            var init = await driveHandler.InitDriveAsync(email);
            _Logger.Info("InitDriveAsync finalizado con resultado: {0}", init);
            if (!init || !driveHandler.LoginOK)
            {
                _Logger.Info("Devolviendo mensaje de error: {0}", driveHandler.MsgError);
                return driveHandler.MsgError;
            }
            _Logger.Info("Login ok, devolviendo \"Ok\"");
            return "Ok";
        }
        catch (Exception e)
        {
            _Logger.Error(e);
            return e.ExceptionErrorMessage();
        }
    }

    public async Task<string> UploadFileAsync(byte[] fileBytes, string fileName, string email)
    {
        _Logger.Info("Comienza subida de fichero con nombre {0}", fileName);

        var driveHandler = await _Users.GetUserDriveHandler(email);
        if (driveHandler == null)
        {
            _Logger.Info("No logueado. Devolviendo \"User not logged\"");
            return "User not logged";
        }

        try
        {
            if (!driveHandler.LoginOK)
            {
                _Logger.Info("No logueado. Devolviendo \"Not logged\"");
                return "Not logged";
            }

            var result = await driveHandler.UploadImageAsync(fileBytes, fileName);
            _Logger.Info("Proceso de subida terminado. Resultado: {0}", result);
            if (!result)
            {
                _Logger.Info("Devolviendo mensaje de error: {0}", driveHandler.MsgError);
                return driveHandler.MsgError;
            }
            _Logger.Info("Subida ok, devolviendo \"Ok\"");
            return "OK";
        }
        catch (Exception e)
        {
            _Logger.Error(e);
            return e.ExceptionErrorMessage();
        }
    }

    public void Dispose()
    {
        if (!_Disposed)
        {
            _Users.Dispose();
        }
        _Disposed = true;
    }

    public void FirstMethod()
    {
        if (ConnectionEvent != null)
        {
            string m = "Alguien se ha conectado";
            ConnectionEvent(null, new ConnectionEventArgs()
            {
                Message = m
            });
            _Logger.Info(m);
        }
    }

    public void LastMethod()
    {
        if (DisconnectionEvent != null)
        {
            string m = "Alguien se ha desconectado";
            DisconnectionEvent(null, new ConnectionEventArgs()
            {
                Message = m
            });
            _Logger.Info(m);
        }
    }
}

Web.config文件

[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMJRFFrasCdadesService
{
    [OperationContract]
    string Ping();

    [OperationContract]
    Task<string> GoogleLoginAsync(string email);

    [OperationContract]
    Task<string> UploadFileAsync(byte[] fileBytes, string fileName, string email);

    [OperationContract(IsInitiating = true)]
    void FirstMethod();

    [OperationContract(IsTerminating = true)]
    void LastMethod();
}

那是。

基本上,我花了一个多星期的时间学习并试图这样做,现在我非常沮丧,我不知道发生了什么,所以任何帮助都会受到赞赏,包括简单的“嘿,你什么都不知道!你必须读这个<?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings> <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> </appSettings> <system.web> <compilation debug="true" targetFramework="4.7.1" /> <httpRuntime targetFramework="4.7.1"/> </system.web> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior> <!-- Para evitar revelar información de los metadatos, establezca los valores siguientes en false antes de la implementación --> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <!-- Para recibir detalles de las excepciones en los fallos, con el fin de poder realizar la depuración, establezca el valor siguiente en true. Para no revelar información sobre las excepciones, establézcalo en false antes de la implementación --> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> </behaviors> <protocolMapping> <add binding="basicHttpsBinding" scheme="https" /> </protocolMapping> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> <!-- Para examinar el directorio raíz de la aplicación web durante la depuración, establezca el valor siguiente en true. Establézcalo en false antes de la implementación para evitar revelar información sobre la carpeta de aplicación web. --> <directoryBrowse enabled="true"/> </system.webServer> </configuration> !“


编辑:好的,由于Mahlatse的迹象,我尝试了一对东西。

在我尝试通过<include here link I shoud read>访问服务之前,出现了一条消息,说https://mjrffacturascomunidadeswebservice.azurewebsites.net/,所以我认为一切正常,但当我尝试将svc文件附加到该URL时,它抛出了一个关于询问会话但使用Your App Service app is up and running的例外。不支持会话。

我从界面的属性basicHTTPbinding[ServiceContract(SessionMode = SessionMode.Required)]FirstMethod方法中删除了会话模式参数,异常消失了。现在,如果一个浏览到LastMethod,它说https://mjrffacturascomunidadeswebservice.azurewebsites.net/MJRFFrasCdadesService.svc和什么不是,所以我想现在它真正启动并运行...所以我试图在我的应用程序测试它,它抛出这个:

You have created a service.

这是一个不同的错误(我想至少它是一个进步)。你可以看到方法 Error: There was an error on processing web request: Status code 405(MethodNotAllowed): Method Not Allowed ; Trace: at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_remoting_wrapper(intptr,intptr) at (wrapper remoting-invoke) ServiceReference1.IMJRFFrasCdadesService.GoogleLoginAsync(string) at ServiceReference1.MJRFFrasCdadesServiceClient.GoogleLoginAsync (System.String email) [0x00006] in <61e2d5b4688b450c9b2865fbef0c9da1>:0 at MJRFFacturasComunidades.Model.WebService.WebServiceClass+<LogEmail>d__6.MoveNext () [0x00023] in <61e2d5b4688b450c9b2865fbef0c9da1>:0 ; 抛出异常,但现在是我的app方法抛出它而不是服务:GoogleLoginAsync是Visual Studio在我仍然自托管服务时添加服务引用时生成的类。

我想我将删除该引用,向Azure中托管的服务添加一个新引用并再次测试所有这些。


Aaditi:

是的,它解决了这个问题,但现在我有了这个问题:

ServiceReference1.MJRFFrasCdadesServiceClient

xD一个接一个。好吧,我不确定我是否应该继续在同一个问题中提出这个问题,因为最初的问题已经解决了,因此我接受了答案并继续尝试或开启一个新问题。

c# web-services wcf xamarin.forms azure-app-service-envrmnt
1个回答
1
投票

您可以尝试以下几种方法

  1. 检查服务是否正在运行(浏览到.svc文件应该足够了)
  2. 检查服务契约是否相同,这将是WSDL文件(检查所有方法是否相同(更重要的是,如果您的方法存在)
© www.soinside.com 2019 - 2024. All rights reserved.