簡體   English   中英

WCF服務返回錯誤方法不允許?

[英]WCF service returns error method not allowed?

我知道互聯網上(包括此處)的文章很少,但是經過幾個小時,仍然找不到解決問題的方法。 我有一項將文件上傳到服務器的服務。 而且我收到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>

解決此問題的方法是將服務合同聲明中的WebInvoke方法從“ POST”更改為“ *”。

我的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" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM