#c# #wcf #http-status-code-405
#c# #wcf #http-status-code-405
Вопрос:
Я знаю, что в Интернете есть несколько статей (в том числе здесь), но через несколько часов все еще не могу найти решение проблемы. У меня есть служба для загрузки файлов на сервер. И я получаю http-ошибку 405, метод не разрешен. Пробовал все, но пока безуспешно. Ниже приведен код службы.
Контракт на обслуживание:
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract(Name = "ExcelUpload.IUploadFile")]
public interface IUploadFile
{
[OperationContract]
[DataContractFormat]
[WebInvoke(Method = "POST",
UriTemplate = "Upload/",
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Json)]
ReturnValue FileUpload(Stream File);
// TODO: Add your service operations here
}
// Use a data contract as illustrated in the sample below to add composite types to service operations.
[DataContract]
public class ReturnValue
{
[DataMember]
public bool IsSuccessfull { get; set; }
}
Класс службы:
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
// NOTE: In order to launch WCF Test Client for testing this service, please select Service1.svc or Service1.svc.cs at the Solution Explorer and start debugging.
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerCall,
IgnoreExtensionDataObject = true,
IncludeExceptionDetailInFaults = true)]
public class UploadFile : IUploadFile
{
public ReturnValue FileUpload(Stream File)
{
using(FileStream writer = new FileStream(@"C:temp", FileMode.Create))
{
int ReadCount = 0;
var buffer = new byte[8192];
while ((ReadCount = File.Read(buffer, 0, buffer.Length)) != 0)
{
writer.Write(buffer, 0, ReadCount);
}
}
return new ReturnValue() { IsSuccessfull = true };
}
}
Веб-конфигурация
<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>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
<serviceActivations>
<add relativeAddress="~/UploadFile.svc" service="ExcelUpload.UploadFile"/>
</serviceActivations>
</serviceHostingEnvironment>
<bindings>
<webHttpBinding>
<binding name="crossDomain"
maxBufferSize="2147483647"
maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647"
transferMode="Streamed"
sendTimeout="00:05:00"
crossDomainScriptAccessEnabled="true">
<readerQuotas maxDepth="2147483647"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
<security mode="None" />
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="defaultServiceBehaviour">
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true"/>s
<serviceThrottling maxConcurrentCalls="100" maxConcurrentInstances="100" maxConcurrentSessions="100"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="defaultEndpointBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service name="ExcelUpload.UploadFile" behaviorConfiguration="defaultServiceBehaviour">
<endpoint address="" behaviorConfiguration="defaultEndpointBehaviour" bindingConfiguration="crossDomain" binding="webHttpBinding" contract="ExcelUpload.IUploadFile"></endpoint>
</service>
</services>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
To browse web app root directory during debugging, set the value below to true.
Set to false before deployment to avoid disclosing web app folder information.
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
Исправления в web.config
<security>
<requestFiltering allowHighBitCharacters="true">
<verbs allowUnlisted="false">
<add verb="POST" allowed="true"/>
<add verb="GET" allowed="true"/>
</verbs>
</requestFiltering>
</security>
Комментарии:
1. предполагая, что вы используете IIS для размещения службы, могу я спросить, уверены ли вы, что метод http POST разрешен в настройках веб-сайта?
2. Да, у меня есть IIS для размещения службы. Где я могу включить http POST в IIS? Возможно ли, что web.config был удален? Я добавил эту строку кода в web.config, но все та же ошибка <безопасность> <Разрешение фильтрации запросов на соседние символы=»true»> <разрешенные глаголы в списке = «false»> <добавить глагол=»POST» разрешено =»true»/> <добавить глагол= «GET» разрешено =»true»/> </verbs> </requestFiltering> </security>
3. по умолчанию IIS должен разрешать эти глаголы, и обычно вам не нужны эти настройки для включения POST. Если IIS не находится под вашим контролем, вы можете обратиться за помощью к системному администратору или протестировать возможность POST с помощью cURL или httpie.
4. У меня есть доступ к серверу. Мы также устанавливаем POST и GET на стороне IIS. Не сработало. Затем я изменил внутри сервисного контракта метод WebInvoke с «POST» на «*». Я думаю, что сейчас это работает, но теперь я получаю отказ в доступе для записи файла в папку (добавлены все разрешения в папку для соответствующего AppPool и пока безуспешно). Но это другой поток. Спасибо за вашу помощь!
5. Убедитесь, что вы установили UseAppPoolCredentials для вашего размещенного приложения, которое использует AppPool.
Ответ №1:
Решением этой проблемы было изменение метода WebInvoke с «POST» на «*» в объявлении контракта на обслуживание.
Комментарии:
1. Здравствуйте, изменение метода на * сработало, однако, что это значит и каков его эффект?
Ответ №2:
Моя служба WCF также выдавала System.ServiceModel.Исключение ProtocolException {«Удаленный сервер вернул неожиданный ответ: (405) Метод не разрешен».} и решением было добавить косую черту (/) в конце к моему адресу конечной точки =»http://myhost/My.Service /» Полная конечная точка
<endpoint
address="http://myhost/My.Service/"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding"
contract="My.Interfaces.IService"
name="myhost_IService_Client_Endpoint" />